文中案例参考 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识别(识别率高,但是要收费)
  • 参考案例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加入黑名单,实现了反爬
  • 隐藏式连接,利用的是爬虫工程师的粗细大意,仔细检查就可以避免访问隐藏式连接