Scrpy 使用中间件(middleware)实现随机UA
前言
UA,即USER_AGENT,是在Request中的header(请求头)部分包含的一个键值对,常用于标志浏览器名称及版本。
Q:为什么设置随机UA?
A:
- 有的网站采用了UA黑/白名单机制,不适用合规的UA会导致无法正确地爬取到正常访问的网页。
- 使用随机请求头,能更好地伪装浏览器,防止被Ban。
Q:如何在每次请求时,更换不同的USER_AGENT?
A:在Scrapy启用DOWNLOADER_MIDDLEWARES
DOWNLOADER_MIDDLEWARES 中文文档
DOWNLOADER_MIDDLEWARES 英文文档
于是,操作步骤如下:
- 创建中间件
- 配置启用中间件
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文件,在不冗杂的情况下直接使用也是没有问题的。
- 使用Servlet实现注册网页的随机认证图片
- 使用Servlet实现注册网页的随机认证图片
- ASP.NET Core -中间件(Middleware)使用
- 使用Java程序实现随机验证码功能的实例
- 使用随机存取文件流:RandomAccessFile实现文本文件内容的随机插入
- js验证码实现---使用Canvas绘制一个随机改变的验证码图片
- N皇后问题 - 使用随机爬山法实现其快速解法
- 使用淘宝中间件cobar实现mysql分库分表
- 使用spring+html5实现安全传输随机数字密码键盘
- ASP.NET Core 使用 URL Rewrite 中间件实现 HTTP 重定向到 HTTPS
- 反爬(使用middleware中间件来限制IP频率)
- 【转载】使用 Apache MINA2 实现 Web 系统的消息中间件
- android-使用PopupWindow实现随机排列的自定义密码键盘
- 使用 Apache MINA2 实现 Web 系统的消息中间件
- 使用mysql 中间件 Atlas 实现数据库读写分离
- 使用java实现,随机取4张牌,使用加减乘除得到24的所有可能情况
- 如是使用JS实现页面内容随机显示
- Skoltech联合牛津发布「深度图像先验」:使用随机初始化神经网络实现图片去噪、超分辨率和修补
- Express使用进阶:cookie-parser中间件实现深入剖析
- django中间件CsrfViewMiddleware源码分析,探究csrf实现