1

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

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

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

并且收到 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 秒。

这两种方法都不起作用。

4

1 回答 1

0

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

mechanizeurllib2使用( )的重度补丁版本Lib/site-packages/mechanize/_urllib2.py进行网络操作,其Browser类是其_urllib2_fork.OpenerDirector.

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

  • default_open适当handler_order地把它放在每个人之前(低优先级)。
  • 这将停止,直到请求符合条件,例如令牌桶漏桶算法,例如在Throttling with urllib2中实现。请注意,存储桶可能应该是每个域或每个 IP。
  • 最后return None将请求推送到以下处理程序

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

于 2015-08-17T09:16:30.013 回答