前言

做爬虫的都知道,模拟真实用户是很重要的,爬虫与反爬虫斗争的过程中,其实就是围绕伪装与鉴别,常见的反爬虫策略都会添加对 User Agent 的校验,会封掉常见的爬虫请求头,比如 Scrapy 默认的 User Agent 是什么呢?同过下面的方式试一下:

 scrapy shell https://httpbin.org/user-agent

在结果中使用:

response.text

进行查看,结果为:

{
    "user-agent":"Scrapy/1.2.1 (+http://scrapy.org)"
}

很显然,如果是这种默认的UA,是很不利于我们爬虫工作的。

那么我们如何在 Scrapy 中为 Spider 设置随机的 User Agent 呢?为了实现这个功能,我们需要使用 Scrapy 的中间件 — Scrapy User Agent Middleware

步骤

首先 在 settings.py 中添加一批可用的 User Agent 列表

USER_AGENT_LIST = [
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.0 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Web Preview) Chrome/22.0.1229 Safari/537.4',
        'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
    ]

然后在 middlewares.py 中添加一个自定义的 中间件。

import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

class CustomizeUserAgentMiddleware(UserAgentMiddleware):
    def __init__(self, user_agent):
        self.user_agent = user_agent

    @classmethod
    def from_crawler(cls, crawler):
        """ 从 settings.py 中读取 预设的 UA 列表 """
        return cls(user_agent=crawler.settings.get('CUSTOMIZE_USER_AGENT_LIST'))

    def process_request(self, request, spider):
        """ 随机选择一个 UA 并设置到 Request 中 """
        agent = random.choice(self.user_agent)
        request.headers['User-Agent'] = agent

最后在 settings.py 中启用中间件

DOWNLOADER_MIDDLEWARES = {
    # 不使用内置的 ua 中间件
   'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
   '{your bot name}.middlewares.CustomizeUserAgentMiddleware': 200,
}

然后启动爬虫就可以了。

参考链接