土地市场分析,基于 Python,基于 Javascript,包含核心参数
最近更新:2022 年 4 月 13 日,橡皮擦的第 <font color=red>900</font> 篇原创博客 @[toc]
⛳️ 实战场景
本次实战场景的目标站点是:landchina.com,如果你正好发现了该文章,我想这个网站的数据对你应该非常重要,由于部分原因,本文无法直接展示该站点名称,所以使用如下关键字替代:土地 = TuDiWang。
我们在该网站中找到任意一列表页面,寻找其分页地址,得到下图所示内容。
本站点每次展示的只有 6000 条数据,累计是 60W+条,如果希望获取全部数据,需要不断缩小筛选条件,每次请求得到的接口数据如下所示:
请求网址: api.landchina.com/tGygg/transfer/list
请求方法: POST
状态代码: 200
请求参数及测试请求值:
endDate
:""
pageNum
:2
pageSize
:10
startDate
:""
xzqDm
:"1101"
数据的分析到这里没有结束,我们需要在查看一下请求头中,是否包含了加密参数。
简单浏览就会发现,其中有一个 Hash 参数,明显有反爬迹象,后续我们分析接口请求逻辑时,可以着重寻找该参数计算逻辑,该参数有可能就是我们最终能否解开问题的密钥所在。
除此之外,还要关注响应头内容,其中的一些跨域信息价值非常高,尤其是当发现 Access-Control-Allow-Origin
参数有值时,那 referer
一定要在请求中包含。
⛳️ 编码时间
接下来,使用 requests 模块进行编码实践,把前文收集到的参数都进行一次整理,硬编码到逻辑中,进行测试。
实测之后发现页面直接就获取到了相应的数据,然后进行多次测试之后,发现接口限制了频率。
网站并没有我们想象中设置了 JS 加密反爬,既然可以直接获取到数据,那需要的读者可以直接进行代码的编写了,但是我们作为分析类文章,还是需要挖掘一下 Hash 参数到底是哪里来的,如何计算出来的。
⛳️ Hash 参数解密时间
首先使用关键字 transfer/list
,添加 XHR 断点,接下来再次选择某一分页。
页面在分页逻辑中进入断点,出现下图所示内容。
断点断住之后,我们在堆栈中进行检索,逐步寻找请求参数的构造逻辑,寻找请求头的构造逻辑。
当点击 _transferList
的时候,发现参数构造的相关函数,具体代码如下图所示。
此时并未查找到 Hash 参数相关逻辑,你可以继续在这里增加断点逻辑,反复检索,也可以唤醒开发者工具的搜索功能,直接输入 Hash,如果可以直接查找到参数赋值的位置,那问题迎刃而解。
使用搜索查找 Hash
,竟然直接找到了加密位置。下图出现的原因是因为我对部分 JS 代码进行了格式化操作,注意下图红框区域上侧的 formatted
内容。
它使用了 UA,时间,以及变量 a(URL 最终的参数,这里是 list
)的截取。
双击查找结果,进入对应代码段,得到如下代码片段。
其中关键问题就是加密函数 e
,到底是何种加密,我们可以直接在该位置增加断点,然后刷新页面。
找到 e
对应的 JS 文件,方法如下图所示。
在文件中搜索 r89N
,得到下图所示结果。
接下来就是前端经验+眼神的问题了,翻阅该函数可以发现一个关键字 SHA256
,此时问题已经解决了,Hash 参数的加密形式为 sha256
,加密参数为上文提及的几个内容。
Python 代码的编写,交由你来完成啦,毕竟这么高风险的事情,橡皮擦肯定不干。
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc8f6015ae208b75f87b65a25】。文章转载请联系作者。
评论