scrapy: UserAgentMiddleware源码与使用详解

一、UserAgentMiddleware 简介

内置的下载中间件
官方文档

1、源码如下

"""Set User-Agent header per spider or use a default value from settings"""

from scrapy import signals


class UserAgentMiddleware:
    """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"]) # 从settings.py中读取USER_AGENT参数
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        # 通过信号,绑定功能,在爬虫被打开的时候触发
        return o

    def spider_opened(self, spider):
    	"""
    	getattr()是python的内置函数,表示取某个对象的属性,如果取不到就返回第三个参数,作为默认值
    	这个函数的含义是标书,从spider对象中读取user_agent参数,这个参数同样赋值给self.user_agent,也就是会把我们从settings文件中通过USER_AGENT设置的值覆盖掉
    	"""
        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)

函数执行的顺序为:from_crawler-> init -> spider_opened -> process_request

2、开关方式

该插件默认开启,关闭方法为在settings中将该中间件置为None

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None
}

二、内容详解

1、from_crawler

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler.settings["USER_AGENT"]) # 从settings.py中读取USER_AGENT参数
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        # 通过信号,绑定功能,在爬虫被打开的时候触发
        return o

这是一个类方法,scrapy框架会首先调用此方法,实例化一个对象。这个函数实现了两个功能,一个是以settings中的USER_AGENT定义的请求头实例化了一个队形。二是定义了一个爬虫打开时的信号

2、init

    def __init__(self, user_agent="Scrapy"):
        self.user_agent = user_agent

此时的self.user_agent为settings里的USER_AGENT

3、spider_opened

    def spider_opened(self, spider):
    	"""
    	getattr()是python的内置函数,表示取某个对象的属性,如果取不到就返回第三个参数,作为默认值
    	"""
        self.user_agent = getattr(spider, "user_agent", self.user_agent)

这个函数的含义是表示,从spider对象中读取user_agent参数,这个参数同样赋值给self.user_agent,结合getattr()方法的功能,我们明白,如果spider里面有user_agent属性,那么这个属性是会把我们从settings文件中通过USER_AGENT设置的值覆盖掉

4、process_request

"""
setdefault()是字典对象的一个方法。如果字典有有个属性,就返回该属性的值,如果没有就设置默认值,并返回这个默认值
"""
    def process_request(self, request, spider):
        if self.user_agent:
            request.headers.setdefault(b"User-Agent", self.user_agent)

此函数为最后一步,如果headers里面有User-Agent,那就相安无事,什么都不做,如果没有的话那就把self.user_agent的值赋给headers.User-Agent

三、总结

设置User-Agent的方法可以有一下几种:
1、settings.py文件中通过USER_AGENT设置

USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'

2、通过spider的类属性设置

class TtSpiderSpider(CrawlSpider):
    name = "tt_spider"
    allowed_domains = ["google.com"]
    start_urls = ["http://google.com/"]
    user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'

2、通过request.headers.User-Agent设置

class HqewSpider(scrapy.Spider):
    name = "t_hqew"
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': 'searchcount1=2qfm;',
        'Pragma': 'no-cache',
        'Referer': 'https://s.hqew.com/LM358.html',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
        'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
    }

其中 headers里的User-Agent优先级最高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜘蛛da侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值