我正在使用 Scrapy 编写一个crawlspider,并使用下载器中间件为每个请求轮换用户代理。我想知道是否有办法暂时解决这个问题。换句话说,我想知道是否可以告诉蜘蛛每 X 秒更改一次用户代理。我认为,也许使用 DOWNLOAD_DELAY 设置来执行此操作可以解决问题。
最佳答案
您的处理方式可能会有所不同。由于您可以通过 CONCURRENT_REQUESTS
、DOWNLOAD_DELAY
和其他相关设置控制每秒请求数的抓取速度,因此您可以只计算同一用户将连续发出多少个请求-代理 header 。
沿着这些思路(基于 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)
这可能不是特别准确,因为也可能存在重试和其他原因,理论上可能会搞砸计数 - 请测试一下。
关于python - 临时 Scrapy 中的用户代理轮换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783264/