本文以页面https://www.dianping.com/shop/jh631305VtnDuXpl/review_all
为例,对大众点评的CSS+SVG字体加密的反爬机制进行破解,解析得到评论信息。
warning:大众点评反爬策略更新的很快,即使机制没变,也会在其它地方设置障碍,让你之前的爬虫完全没法用。比如我在写这篇博客的前几天写好的爬虫,解析出了映射表,结果写博客的时候就用不了。而且它不仅更换了相应的文件,还把文件的格式给改了,这样对文件的解析也得重新来,比如这次,它就把svg的文件格式给改了,解析的难度大了很多,我对这方面不太了解,只能猜+验证。
关键:破解字体加密CSS+SVG
网页:
网页源代码:
二者对比可知:
- 完整的评论由HTML中的两部分组成
- 评论中大量的字被加密了,比如
“吃”
就被加密为<svgmtsi class'qxszj'></svgmtsi>
要解决加密问题,我们再打开开发者工具进行查询,选中加密字1,查看style。
从上图可以知道,<svgmtsi class="qxszj"></svgmtsi>
被background-image
给替换了,并且是将back-ground-image上坐标为-42.0px,-1420.0px
处的元素替换的。2号该URL对应着一个分布着一行一行汉字的SVG文件。而右上角的3号CSS文件则是用于根据 class的值qxszj
,来从background-image
中根据坐标来选取某个汉字的,即其功能是映射。
由于其映射规则保存在CSS文件中,**因此我们需要将该CSS文件和SVG文件都下载下来进行分析。**根据CSS定位背景图片的规则:
x y用百分比或者px表示的时候,其值可以为负数。我们应用坐标规则就很容易理解负数表示的意义,x为负数时候表示图片左顶点在容器左顶点的左侧,y为负数时表示图片的左顶点在容器的左定点的上方
我们首先针对一个字进行分析,即<svgmtsi class="qxszj"></svgmtsi>
映射为“吃”。
读取SVG文件【需要注意的是SVG文件不仅内容会变,格式也会变,写博客的时候,原来的SVG格式就变了】
其中“吃”字所行为:<textPath xlink:href="#36" textLength="322">纸盒秘吃净培杀侄掠留抚源甩宣脑邪蓬非勺吸洞极呼</textPath>
即处于第36行,第4个字。
读取CSS文件,找到字段.qxszj{background:-42.0px -1420.0px;}
即“吃”字加密后的<svgmtsi class="qxszj"></svgmtsi>
被SVG中坐标-42.0px -1420.0px
的文字替代。为了找到坐标和汉字所处行列的规则,我们查看SVG的头部信息:
该字段指明:font-size:14px,而“吃”字:x=-42.0px,第4个字,下标为3,显然:下标为abs(x)/14
而y坐标与行的关系,需要知道行高,但SVG头部并没有直接给出,猜测path id='1' d='M0 33 H600'
表示的是id为1的行,其行所在的y坐标为33,那么的话,“吃”所在的href=36,而此处<path id="35" d="M0 1399 H600"/><path id="36" d="M0 1443 H600"/>'
可以得出规律,要找到第一个d大于y的path id,从而定位到行。
由于缺乏相关知识,上面只是猜测得到的规律,不一定正确,以后有需要再进行研究。
基于上述规律,可以根据CSS文件和SVG文件构建映射表:
import requests
from bs4 import BeautifulSoup
import re
with open