写点什么

土地市场分析,基于 Python,基于 Javascript,包含核心参数

作者:梦想橡皮擦
  • 2022 年 5 月 25 日
  • 本文字数:1765 字

    阅读完需:约 6 分钟

最近更新: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 模块进行编码实践,把前文收集到的参数都进行一次整理,硬编码到逻辑中,进行测试。


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 代码的编写,交由你来完成啦,毕竟这么高风险的事情,橡皮擦肯定不干。

发布于: 18 小时前阅读数: 6
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
土地市场分析,基于Python,基于Javascript,包含核心参数_5月月更_梦想橡皮擦_InfoQ写作社区