Scrpy 使用中间件(middleware)实现随机UA

本文介绍了如何在Scrapy中通过中间件实现随机USER_AGENT,以避免因UA限制导致的爬取问题。首先在middlewares.py文件中创建自定义中间件,然后通过在settings.py全局启用或在spider中个性化启用中间件来应用随机UA策略。同时,文章还提到了启用中间件的注意事项以及可能遇到的问题和解决方案。

前言

UA,即USER_AGENT,是在Request中的header(请求头)部分包含的一个键值对,常用于标志浏览器名称及版本。

Q:为什么设置随机UA?
A:

  • 有的网站采用了UA黑/白名单机制,不适用合规的UA会导致无法正确地爬取到正常访问的网页。
  • 使用随机请求头,能更好地伪装浏览器,防止被Ban。

Q:如何在每次请求时,更换不同的USER_AGENT?
A:在Scrapy启用DOWNLOADER_MIDDLEWARES

DOWNLOADER_MIDDLEWARES 中文文档
DOWNLOADER_MIDDLEWARES 英文文档

于是,操作步骤如下:

  1. 创建中间件
  2. 配置启用中间件

1.创建中间件

scrapy框架在创建项目的时候,已经默认创建了一个middlewares.py文件,我们在文件的末端添加以下代码,便可创建一个属于我们自己的中间件组件。

import random


class RandomUserAgent(object):
    def __init__(self):
        self.user_agent_list = [
            'Opera/8.0 (Windows NT 5.1; U; en)',
            'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
            'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
            'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
            'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
            'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1',
            'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER) ',
            'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"',
            'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)',
            'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
            'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
            'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'
        ]

    def process_request(self, request, spider):
        request.headers['USER_AGENT'] = random.choice(self.user_agent_list)

以上UA是我当时搜集回来的常用UA,具体的版本可能会随时间淘汰,可以自行更新。

2. 配置启用中间件

这里可以使用两种启用中间件的方式:

Ⅰ 在setting.py中启用中间件(全局)

在setting.py中添加:

	DOWNLOADER_MIDDLEWARES = {
	   'jkxy.middlewares.RandomUserAgent': 543,
	}

即可在项目全局启用该中间件。
Q: 为什么说是全局启用呢?
A: 在setting中启用的中间件会在(在项目目录中)调试时,也被调用,如

cd /d <project_path>	# 在项目目录中

scrapy shell
scrapy view

其他设置也同样在调试中生效,所以视情况使用。

Ⅱ 在spider中启用中间件

在spider中是可以覆写setting的,也即sipder中的setting优先级比setting.py优先级要高。
而且,此时的setting是针对单一spider的,不会影响别的spider,可以针对不同的spider进行个性化。
具体实现如下:

    # 覆写settings
    custom_settings = {
        # 不使用使用cookies
        'COOKIES_ENABLED': 'False',
        # 使用随机UA
        'DOWNLOADER_MIDDLEWARES': {'jkxy.middlewares.RandomUserAgent': 543}
    }

所有在setting.py中的字段,以及scrapy支持的设置字段都可以在spider的custom_settings中被覆写。
另外,上述代码中还在spider中禁用了cookies。
个人认为,如果要使用cookies的场景话就没必要使用随机UA了,既然fake了随机UA,也应该禁用cookies进而防止相应的身份识别。

Ⅲ 可能会遇到的一些问题

这里引用一份外站的文章中提到的问题,整理为Q&A
Scrapy增加随机请求头user_agent@简书

Q:自己写的Middleware应该放在哪个目录下?
A:放在items.py和settings.py的同一级目录,也即spiders文件夹同层,而不是spider内。

Q:settings.py中的MIDDLEWARES的路径是如何确定
A:settings.py中的MIDDLEWARES的路径,应该是:

	project_name.middlewares(.py文件名).middleware(class类名)

例如,你的中间件的类名和文件名都使用了RandomUserAgentMiddleware,那这个路径应该写成:

    project_name.RandomUserAgentMiddleware.RandomUserAgentMiddleware

利用这一规则,大家创建自己的py文件。
不过Scrapy框架本身为我们创建了一个pipelines.py文件,在不冗杂的情况下直接使用也是没有问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值