0

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

使用urlopen方法时,可以使用timeout参数设置超时,但我还没有找到简单的方法来使用高级 API,例如submitclick方法。理想情况下,超时将为整个浏览器类设置一次,并且所有调用都会尊重这一点。

可能可以通过将自定义传递request_class给每个clicksubmit调用来自定义它,但这只会污染代码,所以我正在寻找更好的解决方案来为 mechanize 的浏览器类设置超时(不,我不想改变默认套接字超时使用socket.setdefaulttimeout)。

4

2 回答 2

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)

我觉得这更干净一些,但如果您无法控制浏览器实例的创建,它将不起作用。

于 2014-05-29T15:41:56.743 回答
1

您可以尝试使用带有以下代码的 do-while 循环:

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

或者

start = time.time()
... do something
elapsed = (time.time() - start)
于 2014-06-02T14:58:09.207 回答