Python 在Scrapy中暂缓用户代理旋转
我正在使用Scrapy编写爬行爬行器,并使用下载器中间件为每个请求轮换用户代理。我想知道的是,是否有办法暂时解决这个问题。换句话说,我想知道是否有可能让爬行器每X秒更换一次用户代理。我想,也许使用下载延迟设置来实现这一点就可以了 你可能会有点不同的做法。由于您可以通过Python 在Scrapy中暂缓用户代理旋转,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我正在使用Scrapy编写爬行爬行器,并使用下载器中间件为每个请求轮换用户代理。我想知道的是,是否有办法暂时解决这个问题。换句话说,我想知道是否有可能让爬行器每X秒更换一次用户代理。我想,也许使用下载延迟设置来实现这一点就可以了 你可能会有点不同的做法。由于您可以通过并发请求、下载延迟和其他相关设置来控制请求/秒的爬网速度,因此您可以只计算一行中有多少请求使用相同的用户代理标头 (基于)(未经测试)大致如下: 这可能不是特别准确,因为理论上可能会有重试和其他原因导致计数错误-请测试它。这是一种聪
并发请求
、下载延迟
和其他相关设置来控制请求/秒的爬网速度,因此您可以只计算一行中有多少请求使用相同的用户代理标头
(基于)(未经测试)大致如下:
这可能不是特别准确,因为理论上可能会有重试和其他原因导致计数错误-请测试它。这是一种聪明的方法,但我感兴趣的是秒数,而不是请求数。@Simus谢谢,根据您的设置,这两个数字实际上是相互关联的。我希望你能把这些数字联系起来,计算出要设置的请求数……我明白你在说什么了。您将如何通过编程实现这一点?我需要计算请求所需的时间。
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)