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

标签 python timeout mechanize-python

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

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

可以通过将自定义 request_class 传递给每个 clicksubmit 调用来自定义此功能,但这只会污染代码,所以我正在寻找更好的解决方案来为 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/

相关文章:

python - 类实例变量继承和类变量继承

iis - 如何在 HttpWebRequest.BeginGetResponse 上指定超时值而不阻塞线程

python - Mechanize 提交一个表单,创建一个需要下载的动态文件

asp.net - 在ASP.NET内容页面上设置ScriptManager AsyncPostBackTimeout值

javascript - 我怎样才能取消所有未决的 $timeouts?

python - 导入 python3 的 mechanize 分支时出错

python - 如何在 Python Mechanize 中不使用代理

python - 如何在 IOS 应用程序上本地解析 AIML 文件?

python - 我可以使用触发器来添加外键组合吗?

python - 在oracle SQL*PLUS中执行Python脚本