如何使用python-mechanize设置超时?

时间:2014-01-27 15:56:44

标签: python timeout mechanize-python

我正在使用python-mechanize来抓取一些网站,有时这些网站根本不响应请求并且这些请求保持打开的时间太长,所以我需要限制这些请求的超时。

使用urlopen方法时,可以使用timeout参数设置超时,但我还没有找到使用高级API执行此操作的简便方法,例如submit或{{1 }} 方法。理想情况下,对于整个浏览器类,超时只会被设置一次,所有调用都会对此进行设置。

通过将自定义click传递给每个request_classclick调用,可能会对此进行自定义,但这只会污染代码,所以我正在寻找更好的解决方案用于设置机械化浏览器类的超时(不,我不想使用submit更改默认套接字超时。)

2 个答案:

答案 0 :(得分:2)

在Python社区中,它有点不受欢迎,但你可以在浏览器类中“扼杀”所需的行为。

基本上,您需要执行以下操作。创建一个能够满足您需求的功能(使用自定义请求类)。

browser_click = Browser.click
def my_click(self, *args, **kwds):
    browser_click(self, request_class=MyRequestClass, *args, **kwds)
Browser.click = my_click

如果根据您的喜好那样太Ruby了,您可以创建一个类似于Browser的子类。

class MyBrowser(Browser):
    def click(self, *args, **kwds):
        Browser.click(self, request_class=MyRequestClass, *args, **kwds)

我觉得这有点干净,但如果您无法控制浏览器实例的创建,它将无法运行。

答案 1 :(得分:1)

您可以尝试使用do-while循环,其代码如下:

start = time.clock()
... do something
elapsed = (time.clock() - start)

start = time.time()
... do something
elapsed = (time.time() - start)