Scrapy设置User-Agent随机代理

本文介绍了如何在Scrapy中利用fake-useragent库设置User-Agent的随机代理,以避免因网站识别爬虫导致的访问限制。通过安装fake-useragent,创建RandomUserAgentMiddleware中间件,并在settings中配置,可以在每个请求中动态改变User-Agent。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些爬虫被网站禁止,但通过伪装 UA 可以绕过检测。

常见的User-Agent形式如:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

本文解决的是Scrapy设置随机用户代理池的方法,使用到的是fake-useragent


  1. 安装fake-useragent
    pip install fake-useragent

  2. 在Scrapy中建立一个RandomUserAgentMiddlware:

    from fake_useragent import UserAgent
    class RandomUserAgentMiddlware(object):
        # 随机更换user-agent
        def __init__(self, crawler):
            super(RandomUserAgentMiddlware, self).__init__()
            self.ua = UserAgent()
            self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")  # 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)  # 获取ua的ua_type
    
            request.headers.setdefault('User-Agent', get_ua())
    
  3. settings中设置‘RANDOM_UA_TYPE’值

    RANDOM_UA_TYPE = "chrome"
    

    并在DOWNLOAD_MIDDLEWARSE中添加RandomUserAgentMiddlware

    DOWNLOADER_MIDDLEWARES = {
    	'DouBanSpider.middlewares.RandomUserAgentMiddlware': 2,
    	'DouBanSpider.mdownloadermiddlewares.useragent.UserAgentMiddleware': None,
    	}
    
  4. 测试:
    在spider parse_item方法中每次打印User-Agent值:
    print(response.request.headers['User-Agent'])
    parse_item方法完整代码:

    def parse_book(self, response):
        item_loader = DoubanItemLoader(item=DoubanspiderItem(), response=response)
        url = response.url
        item_loader.add_value("url", url)
        item_loader.add_value("url_object_id", get_md5(url))
        item_loader.add_css("book_name", "#wrapper>h1>span:nth-child(1)::text")
    
        author = response.xpath("//*[@id='info']/span[1]/a[1]/text()").extract()
        if author == []:
            author = response.xpath("//*[@id='info']/a/text()").extract()
        item_loader.add_value("author", author)
    
        item_loader.add_css("content", "#link-report .intro p::text")
        item_loader.add_xpath("comment", "//p[@class='comment-content']/span/text()")
        item_loader.add_value("crawl_time", datetime.now())
        douban_item = item_loader.load_item()
        
        print(response.request.headers['User-Agent'])  # 添加断点,查看每次User-Agent值是否变化
        return douban_item
    

测试结果:
在这里插入图片描述

### 如何在Scrapy中正确设置User-Agent 要在 Scrapy 中正确设置 User-Agent,可以通过多种方式实现。以下是几种常见的方法及其具体操作: #### 方法一:全局设置固定的 User-Agent 可以在项目的 `settings.py` 文件中直接指定一个固定值作为全局的 User-Agent。 ```python USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' ``` 这种方法适用于不需要频繁更换 User-Agent 的场景[^1]。 --- #### 方法二:使用随机 User-Agent 列表 如果需要动态切换不同的 User-Agent,则可以采用以下步骤来构建一个随机 User-Agent 池。 ##### 步骤说明: 1. **准备 User-Agent 列表文件** 创建一个包含多个 User-Agent 值的文本文件(例如 `useragents.txt`),每行写入一个有效的 User-Agent 字符串。 ```text Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ... Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 ...) ... ``` 2. **修改 settings.py 配置** 将默认的 `UserAgentMiddleware` 禁用,并启用自定义的中间件。 ```python DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'myproject.middlewares.RandomUserAgentMiddleware': 400, } USER_AGENT_LIST = '/path/to/useragents.txt' # 替换为实际路径 ``` 3. **编写 RandomUserAgentMiddleware 类** 定义一个新的中间件类用于读取和随机选择 User-Agent。 ```python import random class RandomUserAgentMiddleware(object): def __init__(self, user_agent_list): self.user_agents = open(user_agent_list).read().splitlines() @classmethod def from_crawler(cls, crawler): return cls( user_agent_list=crawler.settings.get('USER_AGENT_LIST') ) def process_request(self, request, spider): ua = random.choice(self.user_agents) request.headers['User-Agent'] = ua ``` 此方法能够有效模拟不同浏览器的行为,降低被目标网站封禁的风险[^2]。 --- #### 方法三:通过 Spider 自定义 Header 设置 还可以针对单个 Spider 或特定请求单独设置 User-Agent。 ```python import scrapy class MySpider(scrapy.Spider): name = 'example' def start_requests(self): headers = {'User-Agent': 'Custom/User-Agent/String'} yield scrapy.Request(url='http://www.example.com', headers=headers) ``` 这种方式适合于某些特殊需求下的个性化处理[^3]。 --- #### 注意事项 - 如果同时启用了多个中间件,请注意调整它们之间的优先级顺序,以免发生冲突。 - 当引入外部依赖库时(如 fake-useragent),需额外安装相关模块并通过 pip 进行管理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值