欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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中进行调用了,每次进行爬虫时,都会自己随机产生请求头