第二章 基本库的使用
urlib的使用
比较好用的是parse模块来进行URL的各种处理,
requests的使用
-
requests库也可以session维持,s=requests.Session(),s.get(url=‘…’)
-
有些网站没有设置好HTTPS证书,导致出现不是私密连接的错误,我们可以设置忽略证书的验证,在get请求中加上verify=false即可。
-
有些网站开启了身份认证,这个时候通过auth参数设置即可。
正则表达式
会用就行
httpx的使用
对于强制使用HTTP/2.0的网站,urlib和requests是不支持的,这个时候就得使用httpx了。
第三章 网页数据的解析提取
XPath的使用
基于XML路径选择
Beautiful Soup的使用
非常强大的HTML解析器,推荐使用。
针对HTML语言,能够十分方便的进行解析提取。
pyquery的使用
适用于了解jQuery、CSS的选手
parsel的使用
同时支持Xpath和CSS选择器,并且融合了正则表达式的提取功能。parsel灵活且强大,同时也是最流行的爬虫框架Scrapy的底层支持。
第四章 数据的存储
TXT文本文件存储
采用基本的文件操作读写即可
JSON文件存储
使用Json库来处理Json数据,再采用文件操作读写
CSV文件存储
逗号分隔值或字符分隔值,可以用excel打开
采用csv库来读取csv文件
MySQL存储
采用pymysql库来操作
MongoDB存储
非关系型数据库,基于键值对
采用PyMongo库来操作
Redis缓存存储
redis是一个基于内存的、高效的键值型非关系型数据库,存取效率极高,使用也很简单
采用redis-py库来操作
Elasticsearch搜索引擎存储
方便对存储的数据进行搜索。
使用elasticsearch库
RabbitMQ的使用
RabbitMQ是一个消息队列,可以用于进程间的通信
第五章 Ajax数据爬取
在读本章之前,已经掌握Ajax数据的爬取,无需过多总结
第六章 异步爬虫
协程:运行在用户态的轻量级线程。用户态线程要映射到内核态线程,只有内核态线程才能被CPU调度,用户态线程不行。
异步爬虫的好处就是,在等待服务器返回响应的时候,CPU可以去处理其他事情。
- 并发限制,由于aiohttp支持非常高的并发量,如几万,十万,百万都可以做到,很可能将网站爬挂,所以需要控制并发量。
第七章 JavaScript动态渲染页面爬取
Selenium的使用
Selenium是一个自动化测试工具,可以驱动浏览器完成特定的操作,比如点击、下拉,还可以运行JS代码。
优势是所见即所爬,可以避免有些页面由JS生成,非原始HTML代码,这其中并不包含Ajax请求的情况。也可以避免Ajax中请求接口加密,难以逆向的情况。
有些操作Selenium是不支持的,如下拉进度条,这个时候可以运行JS代码,将进度条下拉。
切换Frame,Selenium默认是在父Frame进行操作的,这个时候就可以切换到子页面进行操作。
延时等待:确保页面加载出来后,再进行操作。
还可以方便对Cookie进行操作,比如获取,添加,删除
Selenium反屏蔽
Splash的使用
- 可以运行Lua脚本
- 支持异步
- Splash相当于一个服务器,可以使业务逻辑更加轻量级。
Pyppeteer的使用
Pyppeteer是Selenium的替代品,相比于Selenium,其不用安装相关浏览器,也不用安装对应驱动,也不用安装对应版本的Selenium库。
- 支持调试模式
- 用户数据持久化,避免重新打开浏览器时又要登录。
Playwright的使用
API简洁又强大
- 支持所有主流浏览器
- 支持移动端页面测试
- 安装、配置简单
- 提供自动等待相关API,减少代码编写复杂度
可以录制浏览器操作,并生成相应代码。
- 支持网络劫持和修改,例如修改request的属性,修改响应结果等。
第八章 验证码的识别
OCR技术识别图形验证码
只能识别图形验证码,就是类似于数字,字母组合的那种
优势是简单(也不是很简单),缺点是正确率较低
OpenCV识别滑动验证码的缺口
其中涉及一些图像处理算法——高斯滤波、边缘检测、轮廓提取等算法,这些技术运用到其他工作中也很有帮助
缺点正确率较低
深度学习识别图形验证码、滑动验证码
优势:正确率较高
缺点:训练和维护模型较为复杂,需要大量训练数据(可能需要自己构造),而且技术实现难度也较高(得写深度学习代码)。
打码平台使用验证码
优势:啥都好,基本上什么都能识别。有自动识别和人工识别,自动识别使用人工智能训练模型,人工识别就识别复杂的。
缺点:付费
手机验证码的自动化处理
关键两步:
- 监听手机短信内容
- 将短信内容转发至指定位置
对于大量手机短信监控与转发,可以使用群控处理,也可以使用卡池,猫池,例如一个设备可以支持插128张电话卡。但是卡池,猫池仅仅用来做短信收发,有点浪费。
接码平台:好处:省事 缺点:付费,不稳定,说不定就用不了了。
第九章 代理的使用
代理的设置
本章详细讲述了各个请求库的代理设置方法,如requests、selenium等
代理池的维护
为什么需要维护代理池?
因为无论是免费代理,还是付费代理,都不能保证可用,所以我们需要维护代理池中代理的可用性,要保证从代理池中取到的代理是可用的。
代理池分为四个模块
- 存储模块:负责存储爬取下来的代理
- 获取模块:负责定时在各大代理网站爬取代理
- 检测模块:负责定时检测代理是否可用
- 接口模块:用API提供对外服务的接口。用接口是因为如果直接连存储模块的数据库的话,需要知道数据库连接信息,也要配置连接,而且别人使用这个代理池的话,也要数据库的连接信息,十分不方便,也不安全。
付费代理的使用
付费代理分为两类设置方案
- 通过接口提取代理:可以灵活控制使用哪个代理
- 使用隧道代理:无需关心具体使用哪个代理,并且代理商会在背后维护整个代理池,更加省心。相当于代理池中的接口模块。
ADSL拨号代理的搭建方法
通过ADSL拨号的机制,实现代理的切换。因为ADSL每次拨号,便会切换一个IP,同时ADSL对应的云主机上搭建了代理服务,我们就可以使用这个代理了。
这种方法的优点就是,由于是单独使用一个服务器,其稳定性更好(不会很多人一起用),速度也更快。
模拟登录
模拟登录的基本原理
模拟登录主要分为两种模式:
-
基于Session和Cookie
分为两种实现方式。1.Cookie里只保存了SessionID相关的信息,服务器根据收到的SessionID找到对应的Session。2.Cookie里直接保存了某些凭证信息,比如Set-cookie字段,服务器拿到Cookie里的凭证信息后,直接校验即可。
对于简单的登录请求,直接获取Set-cookie字段即可,复杂的比如加密参数,可以通过selenium获取cookie字段
-
基于JWT
由于前后端分离越来越普遍,这种方式也越来越流行。JWT实际上就是通过一个Token字段来校验登录状态。
账号池
有些网站采取了反爬虫措施,对于单个账号的频繁爬取会采用封号或禁止访问的风险,这个时候就可以采用账号池来应对。
账号池就是里面有很多账号,然后保存了每个账号相应的cookie或jwt,每次请求时则随机从账号池里选取的cookie或jwt即可。
基于Session和Cookie的模拟登录爬取实战
对于cookie的维持,我们可以直接使用requests库中的session类,就不用去管cookie了,session类会自动帮我们维持cookie。
基于JWT的模拟登录爬取实战
在登录返回的响应中,给了token。
在以后的每个请求头中的authorization字段传入这个token即可。
大规模账号池的搭建
为了避免单个账号频繁的请求被封号,账号池应运而生。
JavaScript逆向爬虫
网站加密和混淆技术简介
网站加密可以分为两类:
-
URL/API参数加密
比如给某些URL的参数加上校验码,或者给接口加上一个验证参数。
-
JavaScript压缩、混淆和加密
- 代码压缩:去除不必要空格、换行,更改变量名,降低代码可读性。
- 代码混淆:使用变量替换、字符串阵列华,多态变异、僵尸函数,使代码变得难以阅读和分析,是理想、实用的保护方案。
- 代码加密:对JS代码加密,转成人无法阅读或者解析的代码。
本节介绍了接口加密技术和各种各样的JavaScript的压缩、混淆技术,并初步了解了WebAssmbly技术。