您的位置:首页 > 其它

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

2019-04-19 16:23 1361 查看

前言

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文件,在不冗杂的情况下直接使用也是没有问题的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: