我正在使用python-mechanize抓取一些网站,这些网站有时根本不响应请求,并且这些请求保持打开时间太长,因此我需要限制这些请求的超时。
使用urlopen
方法时,可以使用timeout
参数设置超时,但我还没有找到使用高级API(例如)来设置超时的简单方法提交
或点击
方法。理想情况下,整个浏览器类的超时设置只设置一次,并且所有调用都会遵守这一点。
可以通过将自定义 request_class
传递给每个 click
和 submit
调用来自定义此功能,但这只会污染代码,所以我正在寻找更好的解决方案来为 mechanize 的浏览器类设置超时(不,我不想使用 socket.setdefaulttimeout
更改默认套接字超时)。
最佳答案
在 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)
我发现这更干净一些,但如果您无法控制浏览器实例的创建,它将不起作用。
关于python - 如何使用 python-mechanize 设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385445/