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

举报
梦想橡皮擦 发表于 2022/04/18 16:14:32 2022/04/18
【摘要】 📢📢📢📢📢📢哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗📆 最近更新:2022 年 4 月 13 日,橡皮擦的第 900 篇原创博客 ⛳️ 实战场景本次实战场景的目标站点是:landchina.com,如果你正好发现了该文章,我想这个网站的数据对你应该非常重要,由于部分原因,本文无法直接展示该站点名称,所以使用如下关键字替代:...

📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗

📆 最近更新:2022 年 4 月 13 日,橡皮擦的第 900 篇原创博客

⛳️ 实战场景

本次实战场景的目标站点是:landchina.com,如果你正好发现了该文章,我想这个网站的数据对你应该非常重要,由于部分原因,本文无法直接展示该站点名称,所以使用如下关键字替代:土地 = TuDiWang。

我们在该网站中找到任意一列表页面,寻找其分页地址,得到下图所示内容。

本站点每次展示的只有 6000 条数据,累计是 60W+条,如果希望获取全部数据,需要不断缩小筛选条件,每次请求得到的接口数据如下所示:

请求参数及测试请求值:

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

📣📣📣📣📣📣
🌻 本文如果发现错误,欢迎在评论区中指正哦 💗
评论区回复者,随机抽取一名幸运读者,砸一个微信红包

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。