📌免责声明:本文章涉及到的代码仅供学习交流使用,不得用于任何商业用途,数据来源于互联网公开内容,没有获取任何私有和非公开权限的信息(个人信息等)。由此引发的任何法律纠纷与本人无关。禁止将本文技术或者本文所关联的Github项目源码用于任何除学习外的目的。
以查询页面https://www.guazi.com/buy
为例,说明获取数据方法。
分析
通过开发者工具发现该页面有数字字体加密,使得数字在响应里无法查看真实结果:
查看响应数据预览,可以发现文本数据可正常解析,但是价格数据被加密,需要进行还原。
在开发者工具的字体过滤器中,可以发现该页面下载了2组字体文件,如图:
查看Fetch/XHR可知,第一个字体是通过接口返回,字体接口如图:
恢复
由以上分析可得出解决思路:
- 下载特殊字体文件;
- 找到真实字形与字符码之间的映射关系;
- 替换响应数据里的数字字符。
首先我们直接下载https://oss.guazi.com/gzim/3800eb83-6f43-4a68-9395-2b80040dab4e.woff2
字体文件,保存到本地。
由于这次字符加密的范围比较小,只有数字0-9共10个字符,并且经观察页面并不存在动态字体的机制,所以只需要做静态分析映射即可。
通过字体编程器如在线的font.qqe2.com(还有其它的,如果无法加载就换一个,比如https://kekee000.github.io/fonteditor/)或本地字体工具fontcreator打开字体文件。可以得到如下图所示结果:
从图中可以分析得出编码与字形之间的映射关系。比如:57808对象数字8,58148对应数字2,按照此规则,按前面中返回的加密字符前后缀,更换编号格式,即可以建立映射字典。
# 根据woff字体文件分析出的编码与数字间的静态映射
code_number_map = {
'': '0',
'': '1',
'': '2',
'': '3',
'': '4',
'': '5',
'': '6',
'': '7',
'': '8',
'': '9'
}
然后用以上映射逐个替换返回值中的加密字段即可。
# item中包含加密数字的属性列表
encrypt_code_list = ['road_haul', 'first_pay', 'price']
# 逐个替换加密数字
for item_key in encrypt_code_list:
temp_attribute = item[item_key]
for key, number in code_number_map.items():
temp_attribute = temp_attribute.replace(key, number)
print(temp_attribute)
另外,如果网站使用了更复杂的文本加密措施,就需要使用font tools库,直接用字体文件中的信息进行动态映射。
评论区