Python Mechanize 返回 HTTP 429 错误

标签 python http mechanize http-status-code-429

我正在尝试通过 mechanize 模块通过 python 执行自动化任务:

  1. 在网络表单中输入关键字,提交表单。
  2. 在响应中查找特定元素。

这是一次性的。现在,我对关键字列表重复此任务。

并且收到 HTTP 错误 429(请求过多)。

我尝试了以下解决方法:

  1. 添加自定义 header (我使用代理专门为该网站记下了它们),使其看起来是合法的浏览器请求。

    br=mechanize.Browser()
    br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36')]
    br.addheaders = [('Connection', 'keep-alive')]
    br.addheaders = [('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')]
    br.addheaders = [('Upgrade-Insecure-Requests','1')]
    br.addheaders = [('Accept-Encoding',' gzip, deflate, sdch')]
    br.addheaders = [('Accept-Language','en-US,en;q=0.8')]`
    
  2. 由于阻塞响应是每 5 个请求出现一次,我尝试在 5 个请求后休眠 20 秒。

两种方法都不行。

最佳答案

您需要限制您的请求速率以符合服务器配置允许的范围。 (Web Scraper: Limit to Requests Per Minute/Hour on Single Domain? 可能会显示允许的速率)

mechanize 使用补丁较多的 urllib2 (Lib/site-packages/mechanize/_urllib2.py) 进行网络操作,并且它的 Browser 类是它的 _urllib2_fork.OpenerDirector 的后代。

因此,修补其逻辑的最简单方法似乎是向您的 Browser 对象添加一个 handler

  • 使用 default_open 和适当的 handler_order 将其放在每个人之前(越低优先级越高)。
  • 这将停止,直到请求符合条件,例如Token bucketLeaky bucket 算法,例如在 Throttling with urllib2 中实现。请注意,存储桶可能应该是按域或按 IP 的。
  • 最后返回无将请求推送到以下处理程序

由于这是一个普遍的需求,您可能应该将您的实现发布为一个可安装的包。

关于Python Mechanize 返回 HTTP 429 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32039686/

相关文章:

python - 如何持久化 Python TextBlob 的模型?

python - 如何将 MLP 的数据调整为 LSTM(预期 ndim=3,发现 ndim=2 错误)

iphone - 在使用 ASIHTTPRequest 请求图像期间何时收到响应代码?

http - 最小 http 服务器回复

linux - 为什么一个HTTP请求请求是在第一个ack包之后发送的?

Python Mechanize 连接失败问题

perl - 在 Perl 中使用 Mechanize 响应下载不正确的文件

python - 使用递归查找数组的排列

python - 如何查看从 Select 中选择了哪些变量

ruby - 想要帮助从嵌套在用 Mechanize 过滤的 javascript 文本中的模型数据中提取