起步

限制访问频率是有效反反爬虫的一个手段。假设每个 n 秒请求一次。恰好我有几个固定的代理 ip。如果在 spider 中设置 DOWNLOAD_TIMEOUT 会使得每个请求之间都有延时,而不是针对代理进行延时,这样就不能很好的利用代理资源。

而我希望的是可以动态的来设置请求延时,目标争取让每个代理间隔 n 秒就发一次请求。

解决

我对 twisted 很陌生,所以试图寻找别人的方法,最后采用了 github 上的分享:scrapy_delayed_requests.py

from twisted.internet import reactor
from twisted.internet.defer import Deferred

class DelayedRequestsMiddleware(object):
    def process_request(self, request, spider):
        delay = request.meta.get('delay_request', None)
        if delay:
            d = Deferred()
            reactor.callLater(delay, d.callback, None)
            return d

很棒的一个技巧。


本文由 hongweipeng 创作,采用 署名-非商业性使用-相同方式共享 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!