200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 字体加密网站的抓取以及思路解决

字体加密网站的抓取以及思路解决

时间:2022-02-12 10:39:21

相关推荐

字体加密网站的抓取以及思路解决

在抓取房产网站的过程中,领导给了一个网站,打开一看觉得这不知名的网站应该没有什么反爬措施吧,那还不是so easy的事情。然后就开始准备干活了。为了稳妥起见,还是打算测试一下反爬措施,首先用常规的requests请求携带请求头进行访问,发现没有什么问题,但是仔细检查发现,这抓下来的html页面和看到的有点不一样啊!

于是查看源码发现了诡异的东西了

发现数字的部分都被这样的诡异的编码给替代了,而打开开发者工具的时候,显示的都是口口口这是什么鬼,更改这个class,网页数字也会由正常显示,变成乱码

所以基本上可以断定就是这个class的部分捣的鬼了,这就是现在比较流行的利用自定的字体格式对html文本进行加密的反爬技术了,这种技术的好处就是直接抓取的话,获取的返回结果都是奇怪的编码,手动复制的话,也复制不下来。

原本还以为是js加载的,但是在查看了开发者工具里面的XHR后发现并不是这么简单。

解决这个问题的第一个想法就是想着这个一个数字可能是对应一个编码吧,手动对照一下看看怎么样,找找规律,费了十几分钟时间总结呀,然而在刷新一遍页面以后,瞬间懵逼了,什么。。。??编码不一样,还有变化,看来这条路是走不通了。

然后就搜索一下这个奇怪的class是哪里的,然后发现这么一个东西

没错,就是她了,再看上面这个format里面的woff,原来是自定义的字体格式,并且每次刷新,上面这串看不懂的编码都会变化,这个应该就是问题是所在了。

然后将以上的这样一串编码复制,用python3的fontTools包将编码转换成字体文件

从标注的地方发现,这个还是经过base64加密的,这里就需要利用base64解密一下

下面上代码

import base64from fontTools.ttLib import TTFontimport iokey = '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'data = base64.b64decode(key)fonts = TTFont(io.BytesIO(data))fonts.save('base.ttf') # 保存成ttf和woff这样的文件格式需要利用FontCreator这样的工具打开, # 这个百度就可以下载fonts.save('base.woff') fonts.saveXML('base.xml') # 保存成这样的格式,可以直接打开进行查看

利用FontCreator打开ttf或者woff文件,显示的样子是这样的

并且你会发现每个数字上面都会对应一个编码,而这个编码uni后面的字符和你在网页上面见到的是一模一样的,有木有

没错这就是他们之间的映射关系,每次刷新页面的时候,后台都会从数据库随机拉出一个自定义的字体样式,然后在html'展示的时候通过映射渲染成正常的字体进行显示。

打开刚刚保存的xml文件可以看到这样的东西

<TTGlyph name="glyph00000"/><!-- contains no outline data --><TTGlyph name="uniE01C" xMin="0" yMin="-39" xMax="523" yMax="721"><contour><pt x="56" y="335" on="1"/><pt x="43" y="468" on="0"/><pt x="69" y="544" on="1"/><pt x="95" y="624" on="0"/><pt x="143" y="667" on="1"/><pt x="214" y="720" on="0"/><pt x="282" y="710" on="1"/><pt x="412" y="710" on="0"/><pt x="459" y="617" on="1"/><pt x="487" y="573" on="0"/><pt x="509" y="508" on="1"/><pt x="517" y="447" on="0"/><pt x="522" y="335" on="1"/><pt x="520" y="271" on="0"/><pt x="508" y="166" on="0"/><pt x="494" y="126" on="1"/><pt x="466" y="51" on="0"/><pt x="400" y="4" on="1"/><pt x="367" y="-39" on="0"/><pt x="282" y="-39" on="1"/><pt x="176" y="-39" on="0"/><pt x="115" y="49" on="1"/><pt x="43" y="127" on="0"/><pt x="43" y="335" on="1"/></contour><contour><pt x="131" y="335" on="1"/><pt x="135" y="155" on="0"/><pt x="177" y="95" on="1"/><pt x="218" y="31" on="0"/><pt x="282" y="35" on="1"/><pt x="343" y="35" on="0"/><pt x="428" y="155" on="0"/><pt x="428" y="321" on="1"/><pt x="428" y="515" on="0"/><pt x="397" y="576" on="1"/><pt x="344" y="635" on="0"/><pt x="218" y="635" on="0"/><pt x="194" y="583" on="1"/><pt x="135" y="515" on="0"/><pt x="132" y="335" on="1"/></contour><instructions/></TTGlyph><TTGlyph name="uniE23D" xMin="0" yMin="-32" xMax="382" yMax="707"><contour><pt x="382" y="-31" on="1"/><pt x="292" y="-26" on="1"/><pt x="292" y="547" on="1"/><pt x="256" y="526" on="0"/><pt x="199" y="496" on="1"/><pt x="142" y="448" on="0"/><pt x="127" y="438" on="1"/><pt x="114" y="522" on="1"/><pt x="186" y="568" on="0"/><pt x="244" y="612" on="1"/><pt x="275" y="637" on="0"/><pt x="279" y="651" on="1"/><pt x="312" y="686" on="0"/><pt x="324" y="707" on="1"/><pt x="374" y="703" on="1"/><pt x="374" y="-26" on="1"/></contour><instructions/></TTGlyph><TTGlyph name="uniE455" xMin="0" yMin="-51" xMax="523" yMax="711"><contour><pt x="420" y="521" on="1"/><pt x="408" y="574" on="0"/><pt x="386" y="597" on="1"/><pt x="349" y="635" on="0"/><pt x="296" y="629" on="1"/><pt x="253" y="635" on="0"/><pt x="220" y="617" on="1"/><pt x="177" y="580" on="0"/><pt x="168" y="522" on="1"/><pt x="141" y="486" on="0"/><pt x="135" y="449" on="1"/><pt x="128" y="407" on="0"/><pt x="128" y="358" on="1"/><pt x="161" y="402" on="0"/><pt x="254" y="449" on="0"/><pt x="306" y="449" on="1"/><pt x="406" y="449" on="0"/><pt x="459" y="382" on="1"/><pt x="522" y="316" on="0"/><pt x="521" y="211" on="1"/><pt x="522" y="143" on="0"/><pt x="493" y="83" on="1"/><pt x="477" y="24" on="0"/><pt x="412" y="-7" on="1"/><pt x="360" y="-39" on="0"/><pt x="293" y="-51" on="1"/><pt x="180" y="-39" on="0"/><pt x="39" y="124" on="0"/><pt x="39" y="317" on="1"/><pt x="27" y="528" on="0"/><pt x="104" y="626" on="1"/><pt x="185" y="710" on="0"/><pt x="301" y="710" on="1"/><pt x="388" y="710" on="0"/><pt x="453" y="661" on="1"/><pt x="498" y="614" on="0"/><pt x="510" y="528" on="1"/><pt x="420" y="530" on="1"/></contour><contour><pt x="142" y="211" on="1"/><pt x="142" y="154" on="0"/><pt x="162" y="122" on="1"/><pt x="172" y="79" on="0"/><pt x="218" y="57" on="1"/><pt x="253" y="35" on="0"/><pt x="292" y="35" on="1"/><pt x="347" y="35" on="0"/><pt x="389" y="81" on="1"/><pt x="430" y="130" on="0"/><pt x="430" y="203" on="1"/><pt x="430" y="281" on="0"/><pt x="349" y="370" on="0"/><pt x="274" y="370" on="1"/><pt x="228" y="370" on="0"/><pt x="184" y="326" on="1"/><pt x="142" y="274" on="0"/></contour><instructions/></TTGlyph><TTGlyph name="uniE46E" xMin="0" yMin="-27" xMax="524" yMax="707"><contour><pt x="49" y="611" on="1"/><pt x="48" y="698" on="1"/><pt x="523" y="707" on="1"/><pt x="523" y="627" on="1"/><pt x="487" y="590" on="0"/><pt x="419" y="491" on="0"/><pt x="384" y="433" on="1"/><pt x="337" y="378" on="0"/><pt x="336" y="304" on="1"/><pt x="297" y="228" on="0"/><pt x="267" y="175" on="1"/><pt x="246" y="83" on="0"/><pt x="239" y="-26" on="1"/><pt x="151" y="-26" on="1"/><pt x="145" y="17" on="0"/><pt x="160" y="69" on="1"/><pt x="169" y="121" on="0"/><pt x="185" y="184" on="1"/><pt x="209" y="309" on="0"/><pt x="278" y="419" on="1"/><pt x="308" y="491" on="0"/><pt x="341" y="539" on="1"/><pt x="380" y="572" on="0"/><pt x="398" y="611" on="1"/><pt x="48" y="618" on="1"/></contour><instructions/></TTGlyph><TTGlyph name="uniE678" xMin="0" yMin="-39" xMax="525" yMax="723"><contour><pt x="142" y="151" on="1"/><pt x="154" y="89" on="0"/><pt x="184" y="62" on="1"/><pt x="227" y="35" on="0"/><pt x="264" y="35" on="1"/><pt x="307" y="35" on="0"/><pt x="337" y="54" on="1"/><pt x="355" y="73" on="0"/><pt x="388" y="105" on="1"/><pt x="408" y="137" on="0"/><pt x="422" y="203" on="1"/><pt x="428" y="212" on="0"/><pt x="432" y="245" on="1"/><pt x="435" y="273" on="0"/><pt x="435" y="300" on="1"/><pt x="439" y="303" on="0"/><pt x="429" y="313" on="0"/><pt x="434" y="319" on="1"/><pt x="409" y="276" on="0"/><pt x="360" y="249" on="1"/><pt x="315" y="223" on="0"/><pt x="259" y="223" on="1"/><pt x="168" y="223" on="0"/><pt x="105" y="285" on="1"/><pt x="43" y="354" on="0"/><pt x="43" y="462" on="1"/><pt x="43" y="574" on="0"/><pt x="108" y="626" on="1"/><pt x="173" y="710" on="0"/><pt x="273" y="722" on="1"/><pt x="347" y="710" on="0"/><pt x="403" y="671" on="1"/><pt x="463" y="633" on="0"/><pt x="524" y="489" on="0"/><pt x="524" y="356" on="1"/><pt x="524" y="214" on="0"/><pt x="496" y="131" on="1"/><pt x="478" y="49" on="0"/><pt x="403" y="5" on="1"/><pt x="343" y="-39" on="0"/><pt x="262" y="-39" on="1"/><pt x="175" y="-39" on="0"/><pt x="122" y="9" on="1"/><pt x="60" y="57" on="0"/><pt x="56" y="144" on="1"/></contour><contour><pt x="425" y="452" on="1"/><pt x="425" y="544" on="0"/><pt x="341" y="649" on="0"/><pt x="284" y="635" on="1"/><pt x="215" y="635" on="0"/><pt x="179" y="586" on="1"/><pt x="135" y="539" on="0"/><pt x="135" y="459" on="1"/><pt x="146" y="387" on="0"/><pt x="177" y="338" on="1"/><pt x="220" y="302" on="0"/><pt x="344" y="301" on="0"/><pt x="425" y="391" on="0"/><pt x="425" y="466" on="1"/></contour><instructions/></TTGlyph>

看到<TTGlyph name="uniE01C" xMin="0" yMin="-39" xMax="523" yMax="721">开头的是不是有的地方有点熟悉(uniE01C),没错这就是每个数字用二维数组进行绘制的数字

In [1]: import numpy as npIn [2]: from matplotlib import pyplot as pltIn [3]: x=np.array([56, 43, 69, 95, 143, 214, 282, 412, 459, 487, 509, 517, 522, 520, 508, 494, 466, 400, 367, 282, 17...: 6, 115, 43, 43, 131, 135, 177, 218, 282, 343, 428, 428, 428, 397, 344, 218, 194, 135, 132])In [4]: y=np.array([335, 468, 544, 624, 667, 720, 710, 710, 617, 573, 508, 447, 335, 271, 166, 126, 51, 4, -39, -39, -...: 39, 49, 127, 335, 335, 155, 95, 31, 35, 35, 155, 321, 515, 576, 635, 635, 583, 515, 335])In [5]: plt.plot(x,y)Out[5]: [<matplotlib.lines.Line2D at 0x194cca74828>]In [6]: plt.show()

用上面的代码展示出来就是一个个的数字的二维数组,而解决这个问题的办法就是在抓取每个页面的时候,都要下载一个对应的字体文件,然后通过与我们第一次下载的base.xml文件进行对比,实际手动对比了一下,每两个文件相同数字之间同一个二维数组点的x之间、y之间的差值在50以内,所以可以依这个作为判断的依据,如果所有的都在这个范围内,则可以判定这两个编码代表的是同一个数字,然后将抓取的html页面全部替换成对编码应的数字,再进行解析,这里只提供一种思路,我没有进行代码的编码,因为在实际的抓取过程中,会产生大量的io,文件的保存,降低爬虫效率。

另外一种思路是将保存的xml文件的二维数组全部利用生成图片,再利用TensorFlow进行识别,这个工程量也蛮大的。

我的解决办法是,在进行测试过程中发现会有url重定向到移动端,然后打开移动端,发现数字没有进行加密,这下就爽歪歪,可以愉快的进行抓取了。

虽然以上文本加密的问题解决了,但是还是遇到了抓取下来的页面和实际查看源码中的不同,url会变化,这个需要反复的对照比对修正,以上是遇到的问题,记录下来,仅供参考。本文仅供学习交流,禁止用于商业用途。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。