在Scrapy中临时用户代理轮换

时间:2015-09-25 13:24:36

标签: python web-scraping scrapy

我正在使用Scrapy编写一个crawlspider,我使用下载中间件来为每个请求轮换用户代理。我想知道如果有一种方法来临时化。换句话说,我想知道是否有可能告诉蜘蛛每X秒更换用户代理。我想,也许,使用DOWNLOAD_DELAY设置来做到这一点就可以了。

1 个答案:

答案 0 :(得分:2)

你可能会有点不同。由于您可以通过CONCURRENT_REQUESTSDOWNLOAD_DELAY和其他相关设置控制请求/秒抓取速度,因此您可能只计算一行中有多少请求使用相同的User-Agent标头。

这些内容(基于scrapy-fake-useragent)(未经测试):

from fake_useragent import UserAgent

class RotateUserAgentMiddleware(object):
    def __init__(self, settings):
        # let's make it configurable
        self.rotate_user_agent_freq = settings.getint('ROTATE_USER_AGENT_FREQ')

        self.ua = UserAgent()

        self.request_count = 0
        self.current_user_agent = self.ua.random

    def process_request(self, request, spider):
        if self.request_count >= self.rotate_user_agent_freq:
            self.current_user_agent = self.ua.random 
            self.request_count = 0
        else:
            self.request_count += 1

        request.headers.setdefault('User-Agent', self.current_user_agent)

这可能不是特别准确,因为也可能有重试和其他原因理论上会搞砸计数 - 请测试它。