我正在用Python 2.7.3编写一个带有GRequests和lxml的小脚本,它允许我从不同的网站收集一些可收藏的卡片价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过了它,就会发送回HTTP错误429。
有没有一种方法可以添加对grequeste中请求数的限制,以使我不超过指定的每秒请求数?
另外-如果发生了HTTP 429,我如何使GRequestes在一段时间后重试?
另一方面,他们的上限低得离谱。大约每15秒8个请求。我用浏览器多次破坏它,只是刷新页面等待价格变化。
Tags:
看起来没有任何简单的机制来处理请求或grequests代码中的这个构建。唯一的陷阱似乎是回应。
这里有一个超级黑客工作,至少证明这是可能的-我修改了grequests,以保持一个发出请求的时间列表,并睡眠AsyncRequest的创建,直到每秒的请求数低于最大值。
可以使用grequests.imap()以交互方式观看
我希望有一个更优雅的解决方案,但到目前为止我找不到。在会话和适配器中四处查看。或许可以增加池管理器?
另外,我也不会把这段代码放到产品中,'q'列表永远不会被删减,最终会变得很大。另外,我不知道它是否真的像广告上说的那样有效。它看起来就像是当我看控制台输出。
呃。看了这段代码我就知道是凌晨3点了。该上床睡觉了。
查看此以了解自动请求限制: https://pypi.python.org/pypi/RequestsThrottler/0.2.2
您可以在每个请求之间设置一个固定的延迟量,也可以在固定的秒数内设置要发送的请求数(这基本上是一样的):
函数
multi_submit
返回ThrottledRequest
的列表(请参阅末尾的doc:link)。然后您可以访问响应:
或者,您也可以通过指定在固定时间内发送的请求数(例如,每60秒发送15个请求)来实现相同的目的:
两个解决方案都可以在不使用
with
语句的情况下实现:有关详细信息:http://pythonhosted.org/RequestsThrottler/index.html
我要回答我自己的问题,因为我得自己想,似乎很少有关于这方面的信息。
这个想法如下。与GRequests一起使用的每个请求对象在创建时都可以将会话对象作为参数。另一方面,会话对象可以安装在发出请求时使用的HTTP适配器上。通过创建自己的适配器,我们可以拦截请求并以最适合应用程序的方式限制它们的速率。在我的情况下,我最终得到了下面的代码。
用于限制的对象:
HTTP适配器:
设置:
相关问题 更多 >
编程相关推荐