土地市场分析,基于Python,基于Javascript,包含核心参数 Y7
📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗
📆 最近更新:2022 年 4 月 13 日,橡皮擦的第 900 篇原创博客
⛳️ 实战场景
本次实战场景的目标站点是: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 模块进行编码实践,把前文收集到的参数都进行一次整理,硬编码到逻辑中,进行测试。
import requests
headers = {
"Accept": "application/json, text/plain, */*",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ……",
"Host": "api.Python爬虫.com",
"Origin": "Python爬虫.com",
"Referer": "Python爬虫.com"
}
params = {"pageNum": 3, "pageSize": 10, "xzqDm": "1101", "startDate": "", "endDate": ""}
res = requests.post('域名打码/tGygg/transfer/list', headers=headers, json=params, verify=False)
print(res.text)
实测之后发现页面直接就获取到了相应的数据,然后进行多次测试之后,发现接口限制了频率。
{ "msg": "访问过于频繁!", "code": 500 }
网站并没有我们想象中设置了 JS 加密反爬,既然可以直接获取到数据,那需要的读者可以直接进行代码的编写了,但是我们作为分析类文章,还是需要挖掘一下 Hash 参数到底是哪里来的,如何计算出来的。
⛳️ Hash 参数解密时间
首先使用关键字 transfer/list
,添加 XHR 断点,接下来再次选择某一分页。
页面在分页逻辑中进入断点,出现下图所示内容。
断点断住之后,我们在堆栈中进行检索,逐步寻找请求参数的构造逻辑,寻找请求头的构造逻辑。
当点击 _transferList
的时候,发现参数构造的相关函数,具体代码如下图所示。
pageNum: this.pageNum,
pageSize: this.pageSize,
xzqDm: t || void 0,
ggLx: this.formInline.gglx || void 0,
landUsage: this.formInline.tdyt || void 0,
startDate: this.formInline.startTime ? this.formInline.startTime + " 00:00:00" : "",
endDate: this.formInline.endTime ? this.formInline.endTime + " 23:59:59" : "",
gyggBt: this.formInline.title || void 0,
keyCity: this.keyCity || void 0
此时并未查找到 Hash 参数相关逻辑,你可以继续在这里增加断点逻辑,反复检索,也可以唤醒开发者工具的搜索功能,直接输入 Hash,如果可以直接查找到参数赋值的位置,那问题迎刃而解。
使用搜索查找 Hash
,竟然直接找到了加密位置。下图出现的原因是因为我对部分 JS 代码进行了格式化操作,注意下图红框区域上侧的 formatted
内容。
它使用了 UA,时间,以及变量 a(URL 最终的参数,这里是 list
)的截取。
双击查找结果,进入对应代码段,得到如下代码片段。
var e = i("r89N")
, a = t.url.split("/");
return n.Hash = e(navigator.userAgent + (new Date).getDate() + a[a.length - 1]),
其中关键问题就是加密函数 e
,到底是何种加密,我们可以直接在该位置增加断点,然后刷新页面。
找到 e
对应的 JS 文件,方法如下图所示。
在文件中搜索 r89N
,得到下图所示结果。
接下来就是前端经验+眼神的问题了,翻阅该函数可以发现一个关键字 SHA256
,此时问题已经解决了,Hash 参数的加密形式为 sha256
,加密参数为上文提及的几个内容。
Python 代码的编写,交由你来完成啦,毕竟这么高风险的事情,橡皮擦肯定不干。
📣📣📣📣📣📣
🌻 本文如果发现错误,欢迎在评论区中指正哦 💗
评论区回复者,随机抽取一名幸运读者,砸一个微信红包
- 点赞
- 收藏
- 关注作者
评论(0)