scrapy爬虫中的useragent(用户代理)的“随机更换”功能
程序员文章站
2022-05-09 10:04:25
...
如何在scrapy中使用useragent功能
使用useragent功能的原因
在平常使用爬虫时,绝大多数网站都会根据你所使用的请求头(User-Agent)来区分是否为爬虫程序,很容易拒绝我们的请求,在开始,我们会自定义一个请求头来完成我们的程序,但是,当我们用我们的爬虫程序去爬大量的网站时,使用同一个User-Agent是往往不够的,而添加多个又太过的繁琐,本文所提到useragent功能来设置随机的请求头,这样使我们的爬虫更加快捷。
用户代理功能的安装
第一步
在命令行中运行 pip install fake-useragent来下载库
第二步
根据scrapy中useragent.py中的UserAgentMiddleware类来写middlewares.py随机请求头的类
源码中的useragent.py中请求头的类
"""Set User-Agent header per spider or use a default value from settings"""
from scrapy import signals
class UserAgentMiddleware(object):
"""This middleware allows spiders to override the user_agent"""
def __init__(self, user_agent='Scrapy'):
self.user_agent = user_agent
@classmethod
def from_crawler(cls, crawler):
o = cls(crawler.settings['USER_AGENT'])
crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
return o
def spider_opened(self, spider):
self.user_agent = getattr(spider, 'user_agent', self.user_agent)
def process_request(self, request, spider):
if self.user_agent:
request.headers.setdefault(b'User-Agent', self.user_agent)
然后根据上面所提供的类在Scrapy中的middlewares.py中写入随机请求头的类
from fake_useragent import UserAgent
class RandomUserAgentMiddlware(object):
def __init__(self, crawler):
super(RandomUserAgentMiddlware, self).__init__()
self.ua = UserAgent()
#读取在settings文件中的配置,来决定ua采用哪个方法,默认是random,也可是ie、Firefox等等,参考前面的使用方法。
self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")
@classmethod
def from_crawler(cls, crawler):
return cls(crawler)
#更换用户代理逻辑在此方法中
def process_request(self, request, spider):
def get_ua():
return getattr(self.ua, self.ua_type)
print get_ua()
request.headers.setdefault('User-Agent', get_ua())
第三步
设置settings里面的配置
DOWNLOADER_MIDDLEWARES = {
'ArticleSpider.middlewares.RandomUserAgentMiddlware': 543,
#将在middlewares.py中定义了RandomUserAgentMiddlware类添加到这里;
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
#需要将scrapy默认的置为None不调用
}
RANDOM_UA_TYPE = "random" #或者指定浏览器 firefox、chrome...
ps:一定不要忘了把原来scrapy默认的设置,设置为None
这样在每次爬虫时不用单独在每个spider中进行调用了,每次进行爬虫时,都会自己随机产生请求头