我正在使用Scrapy编写一个crawlspider,我使用下载中间件来为每个请求轮换用户代理。我想知道如果有一种方法来临时化。换句话说,我想知道是否有可能告诉蜘蛛每X秒更换用户代理。我想,也许,使用DOWNLOAD_DELAY设置来做到这一点就可以了。
答案 0 :(得分:2)
你可能会有点不同。由于您可以通过CONCURRENT_REQUESTS
,DOWNLOAD_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)
这可能不是特别准确,因为也可能有重试和其他原因理论上会搞砸计数 - 请测试它。