我正在使用python-mechanize来抓取一些网站,有时这些网站根本不响应请求并且这些请求保持打开的时间太长,所以我需要限制这些请求的超时。
使用urlopen
方法时,可以使用timeout
参数设置超时,但我还没有找到使用高级API执行此操作的简便方法,例如submit
或{{1 }} 方法。理想情况下,对于整个浏览器类,超时只会被设置一次,所有调用都会对此进行设置。
通过将自定义click
传递给每个request_class
和click
调用,可能会对此进行自定义,但这只会污染代码,所以我正在寻找更好的解决方案用于设置机械化浏览器类的超时(不,我不想使用submit
更改默认套接字超时。)
答案 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)