网页抓取 加密html(抓取房产网站应该没有什么反爬措施?解密一下)

优采云 发布时间: 2022-03-23 02:12

  网页抓取 加密html(抓取房产网站应该没有什么反爬措施?解密一下)

  在抢夺财物网站的过程中,领队给了一个网站,打开一看,感觉这个不知名的网站应该没有防爬措施吧,不是那么容易的事。然后准备工作。为了安全起见,我还是打算测试一下防爬措施。首先,我使用常规 requests 请求携带请求头来访问它。我发现没有问题。

  所以我检查了源代码,发现了一些奇怪的东西。

  

  发现部分数字被替换成了这么奇怪的代码,打开开发者工具时,所有的字都显示出来了。

  

  这是什么鬼,换了这个类,网页上的数字也会正常显示,变成乱码

  

  所以基本上可以得出结论,这个类的部分是罪魁祸首。这是比较流行的反爬虫技术,它使用自定义字体格式来加密 html 文本。这种技术的好处是,如果直接抓取,可以得到返回的结果都是奇怪的代码,如果手动复制,就复制不了了。

  我以为是js加载的,但是在开发者工具中查看XHR后发现,并不是那么简单。

  解决这个问题的第一个想法是认为这个数字可能对应一个代码,手动查看,看看是怎么回事,找到模式,花了十多分钟总结,但再次刷新页面后,瞬间迷茫, 什么。. . ? ? 编码不同,仍然有变化。看来这条路行不通了。

  然后我搜索了这个奇怪的类在哪里,发现了这样一个东西

  

  没错,就是她。查看上述格式的 woff。原来是自定义字体格式,每次刷新,一串看不懂的代码都会变。这应该是问题所在。

  然后复制上面的一串代码,使用python3的fontTools包将代码转换成字体文件

  

  从标注的地方发现这个还是用base64加密的,这里我们需要用base64来解密

  下面的代码

  import base64

from fontTools.ttLib import TTFont

import io

key = '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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文件可以看到类似这样的东西

  看到开头有点眼熟(uniE01C),没错,这个就是每个数字用二维数组画出来的数字

  In [1]: import numpy as np

In [2]: from matplotlib import pyplot as plt

In [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]: []

In [6]: plt.show()

  

  上面的代码展示了一个二维的数字数组,解决这个问题的方法是在每个页面爬取的时候下载一个对应的字体文件,然后和我们第一次下载的那个一起传递。对比base.xml文件,进行实际手动对比。同一个二维数组点每两个文件中相同数字的x和y相差在50以内,可以以此作为判断依据。,如果都在这个范围内,则可以确定这两个代码代表同一个数字,然后将所有抓取到的html页面替换为对应代码对应的数字,然后解析,只提供一种思路这里,我没有写代码,因为在实际的爬取过程中,会产生大量的io,

  另一种思路是,使用保存的xml文件的所有二维数组生成图片,然后使用TensorFlow进行识别,工作量相当大。

  我的解决方法是在测试的时候发现会有一个url重定向到手机端,然后打开手机端发现号码没有加密。

  虽然上面的文字加密问题已经解决了,但是还是遇到了抓取页面和实际查看源码的差异,url会发生变化。这就需要反复比较和修正。以上是遇到的问题,记录一下,仅供参考。本文仅供学习交流,禁止商业用途。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线