摘要:本篇是分布式爬取知乎全站系列四,主要是middlewares的简介、解耦、代码,以及反反爬。
一、scrapy中middlewares简介
middlewares即中间件,主要作用有三:
1. 在爬虫发出请求前进行预处理,由process_request()函数负责。
2. 在爬虫解析回复前进行预处理,由process_response()函数负责。
3. 处理中间件抛出的异常,由process_exception()函数负责。
以上是中间件最重要的三个函数。
二、中间件的解耦
不同处理的代码分开写在不同的中间件,逻辑清晰,利于维护和阅读。
如上图,一共三个中间件。执行顺序由settings.py中的数值从小到大。
注意,上述是正常情况的执行顺序,实际根据返回值的不同而不同。
对于Process_request()来说,见下图
其余2个函数类似,具体请查阅scrapy官方文档。
三、middlewares的Python代码
0.导入相关模块
1.UserAgent中间件的Python代码
2.Author中间件的Python代码
process_response函数
说明:
a.有些代理服务器或目标服务器无论是否错误,都会返回200,则需判断是否真正是200。
b.404即请求资源不存在,因此直接忽略请求
c.401、403则更新authorization,并返回请求重新调度
d.其它错误直接返回请求,重新调度
3.proxy中间件的代码,主要就是随机更换代理服务器。
说明:
a.个人在爬取知乎时使用了稳定的代理ip,因此无需维护和更换代理ip。
b.代理ip请自行购买或者爬取,爬取时需自行维护代理池。
c.常写爬虫的手头都会有大量的代理ip。
四、关于反反爬
从以上可以看出,爬取知乎时的反反爬手段:
1. 更换User-Agent
2. 更换authorization。
2.1 每个知乎用户每次登陆时都会有一个authorization。
2.2 知乎通过authorization限速。
2.3 账户越多显然越快(80个账户)。
2.4 爬取过快需要验证码验证:1,自写代码识别;2,打码平台识别;3,人工智能训练模型识别。
爬取知乎可用打码平台识别。
3. 更换代理服务器。
爬取代理ip请参考网络爬虫之代理服务器反反爬。
4. settings.py需要反复调试速度。不同数量的账户和代理ip爬取速度不同。
五、关于更换authorization,相信一路跟着教程的朋友都可以实现。
请点赞支持! 如有疑问请评论区留言,