文中案例参考 GitHub项目
4 文本混淆反爬虫
4.1 图片伪装为文字反爬虫
- 有些文字内容实际是图片伪装的
- 提取图片的内容(图片请求响应结果res.content就是图片的字节数据,可以直接write为图片对象,也可以打开为图片对象,看案例)
- 图片对象使用光学字符识别技术(pytesseract库)从图片中提取文字
- PyTesseract缺点:只能识别出一些清晰工整的图像中的文字,扭曲的文字或者有其它颜色图片干扰信息时候识别不准确
- 参考案例001(02文件夹中)
4.2 CSS偏移反爬虫
- 一般用于数字显示,源码中有很多数字,用于混淆
- 网页中显示的出来的内容的位置是固定的,源码中的数字进行偏移覆盖才是最终显示出来的数字
- 去哪儿网的航班票价就是进行CSS偏移处理过的
- 前面有数字120 下面有数字002
- 002通过不同的左右偏移位置覆盖在120的数字上才是最终显示结果
- 参考图片002
4.3 SVG图形映射反爬虫
- SVG是一种二维矢量图形格式,放大缩小清晰度保持不变
- SVG映射反爬虫:前端或者后端里面将文字或者数字映射为对应SVG图形文件
网页源码中显示的是SVG图形文件,并没有实际的文字或者数字内容 - 最常用于团购网站商家电话的替换
- 映射替换有两种方式:
- 方式1:一个SVG图片代表一个数字或者文字。要显示内容的地方使用SVG图片替代,一般是设置class样式,然后设置背景图片,用SVG图片插到盒子中
- 方式2:将所有的数字或者文字都放在一张SVG图片上,然后设置为背景图片,然后通过偏移图片的位置显示内容
- 方式3:将所有的数字或者文字都放在一张SVG图片上,然后设置为背景图片,图片位置不同,SVG图片里面的的数字是可以通过改变xy轴坐标显示的位置的
- 具体参考图书的P181页,关键是找到映射的规律
4.4 自定义网页字体(常用woff格式字体)反爬虫
- 自定义的字体格式:woff ttf eot otf
- 文中的数字使用自定义字体样式进行替代,查看元素数字都是显示的方框或者其它特殊符号
- 查看元素里面可以数字都有一个class样式,查看该class样式具体内容,只用一个font-family,对应的值就是自定义的字体样式
- 查看源码,数字是一些特殊编码,特殊编码就是字体文件里面定义的数字对应的编码
- woff等字体文件请求的网址,可以下载字体文件到本地,然后使用
- 百度在线字体编辑打开查看:http://fontstore.baidu.com/static/editor/index.html
- 参考003图片
- WOFF字体文件研究
- WOFF(Web Open Font Format, web开放字体样式)是一种网页采用的字体格式标准
- 本质上WOFF是基于SFNT字体,具有TrueType字体的结构,TrueType字体由网格上一系列的点进行描述,点是字体的最小单位
- WOFF文件等字体文件可以使用python中的第三方fonttools转换为XML文件,便于观察里面的具体数据
- pip install fonttools
- 参考案例004
- 打开XML文件,下面内容就是描述数字6的字形文件
- TTGlyph里面有字形的名称、x和y轴坐标数据(可理解为字形的宽和高)
- contour里面只字形的轮廓信息,即多个点的坐标位置,就是这些点连接在一起构成一个字形
- 注意:相同的字形的宽高或者轮廓点可能会不一样,但是它们描述的会是一个字形
因此,只有起止坐标和点坐标数据完全一样的字形,我们才能肯定它们是相同的字符
<TTGlyph name="uniE339" xMin="0" yMin="-12" xMax="510" yMax="719">
<contour>
<pt x="410" y="534" on="1"/>
<pt x="398" y="586" on="0"/>
<pt x="377" y="609" on="1"/>
<pt x="341" y="646" on="0"/>
<pt x="289" y="646" on="1"/>
<pt x="247" y="646" on="0"/>
<pt x="215" y="623" on="1"/>
<pt x="173" y="592" on="0"/>
<pt x="150" y="535" on="1"/>
<pt x="138" y="506" on="0"/>
<pt x="125" y="423" on="0"/>
<pt x="125" y="369" on="1"/>
<pt x="157" y="418" on="0"/>
<pt x="248" y="464" on="0"/>
<pt x="299" y="464" on="1"/>
<pt x="386" y="464" on="0"/>
<pt x="510" y="334" on="0"/>
<pt x="510" y="232" on="1"/>
<pt x="510" y="165" on="0"/>
<pt x="452" y="49" on="0"/>
<pt x="352" y="-12" on="0"/>
<pt x="286" y="-12" on="1"/>
<pt x="176" y="-12" on="0"/>
<pt x="38" y="147" on="0"/>
<pt x="38" y="335" on="1"/>
<pt x="38" y="543" on="0"/>
<pt x="114" y="637" on="1"/>
<pt x="181" y="719" on="0"/>
<pt x="294" y="719" on="1"/>
<pt x="379" y="719" on="0"/>
<pt x="433" y="671" on="1"/>
<pt x="486" y="625" on="0"/>
<pt x="498" y="541" on="1"/>
</contour>
<contour>
<pt x="139" y="232" on="1"/>
<pt x="139" y="188" on="0"/>
<pt x="178" y="103" on="0"/>
<pt x="247" y="60" on="0"/>
<pt x="285" y="60" on="1"/>
<pt x="339" y="60" on="0"/>
<pt x="420" y="150" on="0"/>
<pt x="420" y="227" on="1"/>
<pt x="420" y="300" on="0"/>
<pt x="341" y="387" on="0"/>
<pt x="223" y="387" on="0"/>
<pt x="139" y="301" on="0"/>
</contour>
<instructions/>
</TTGlyph>
- 可以利用fonttools打开网页的字体文件进行分析
- 找出每个字符映射到网页源码中的代码,实现WOFF字形文件的映射文件
- 但是如果开发者经常更换字体文件或者使用多套woff字体文件随机切换(只需要引用路径随机更换即可,网页源码使用了字体样式,字符代码就会自动更换)
- 会使爬取难度越来越大
4.5 文本混淆爬虫通用解决方法
- 光学字符识别OCR可以是识别图形中的文字,但是WOFF字体文件和SVG图形中文字太多或者干扰因素多的时候就无法识别
- 解决方法:
- 使用Python连接Splash渲染工具,进行网页所需部分的截图
- 拿到截图后保存到本地
- 使用PyTesseract库识别指定的图片
- 该方法缺点:PyTesseract是一个开源库,识别率较低
- 解决方法: 使用第三方文字识别API
- 腾讯云OCR识别(识别率高,但是要收费)
- https://cloud.tencent.com/act/event/ocrdemo
- 参考案例005及书中P202
5 特征识别爬虫
- HTML文档对象 DOM
- HTML文档对象DOM(Document Object Model)
- HTML DOM对象是对HTML文档所有元素进行访问的入口,这个入口就是文档对象模型,简称DOM
- DOM是W3C组织推荐的处理可扩展标志语言的标准编程接口
- DOM以面向对象的方式描述文档模型,定义了表示和修改文档所需要的对象的名称、对象的行为、对象的属性以及和对象之间的关系
- 在网页中,组织页面或者文档对象被放在一个树形的结构中,其中用来表示对象的标准模型就是DOM
- HTML文档树形结构最顶层的对象就是document
- DOM也可以理解为一个容器,EChats中绘图前都需要在网页中准备一个DOM容器对象
- 浏览器器对象 BOM
- 浏览器对象模型BOM(Browser Object Model)
- BOM对象是用来获取和操作浏览器的属性,主要对象有
- window: 浏览器窗口对象,所有的JavaScript全局对象、函数和变量均自动成为该对象的成员
- window.navigator:访问者浏览器的相关信息
- window.location: 窗口当前显示的文档的web地址
- window.screen: 访问者浏览器的屏幕信息
- window.onload:HTML文档整体加载后,再执行window.onload里面的代码
- 详细DOM和BOM对象属性和方法查看图书P66-P69
5.1 Webdriver识别反爬虫
- webdriver特征是可以修改的,不可靠
- 参考案例006
5.2 浏览器特征
- navigator.userAgent 浏览器器属性
- navigator.platform 用户计算机信息
- 参考截图007_浏览器特征
- 上面的浏览器特征也是和navigator.webdriver一样可以认为进行修改的,一样不可靠
5.3 爬虫特征
- IP地址访问频率限制:使用IP池,分布式爬虫(多台机器轮流访问)
- 用户凭证(cookie或者token)和浏览器指纹限制:
- web框架自带访问频率限制:登陆用户每天访问1000次,未登录每天100次
- web框架自带限速模块Throttling
- 用户凭证反爬虫:申请大量用户,访问时候随机携带cookie或token值,类似IP代理池
- 登录用户可靠凭证:cookie或token
- 未登录用户可靠凭证:
- Canvas生成的指纹、WebGL生成的指纹、Navigator对象的属性值、客户端其它属性值,综合生成的特征值
- Fingerprint.js库可以生成一个重复率极低的特征指纹
5.4 隐藏连接反爬虫
- 隐藏连接反爬虫一般使用在大量列表中,将个别列表成员的css属性添加一个隐藏属性,display:none
- 正常页面该盒子已被隐藏,用户浏览器访问不到,但是爬虫循环访问时候可以访问到
- 后端设置访问该链接就被视为爬虫,然后将IP加入黑名单,实现了反爬
- 隐藏式连接,利用的是爬虫工程师的粗细大意,仔细检查就可以避免访问隐藏式连接