Python mechanize返回HTTP 429错误

时间:2015-08-16 20:37:41

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

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

  1. 在网络表单中输入关键字,提交表单。
  2. 在响应中查找特定元素。
  3. 这是一次性的。现在,我重复此任务以获取关键字列表。

    我收到HTTP错误429(请求太多)。

    我尝试了以下方法解决此问题:

    1. 添加自定义标题(我通过使用代理专门针对该网站注明了这些标题),以便它看起来是合法的浏览器请求。

      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秒。

    3. 这两种方法都不起作用。

1 个答案:

答案 0 :(得分:0)

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

mechanize使用经过严格修补的urllib2版本(Lib/site-packages/mechanize/_urllib2.py)进行网络操作,其Browser类是其_urllib2_fork.OpenerDirector的后代。

因此,修补其逻辑的最简单方法似乎是在handler对象中添加Browser

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

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