【首发】写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社
theme: vue-pro
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗
⛳️ 实战场景
本次要采集的是一个出版社相关的站点,目标站点相关信息如下所示:
- 站点域名:
aHR0cHM6Ly9wZGMuY2FwdWIuY24v
(Base64 编码) - 站点中文名称:图书出版社,出版社查询,出版机构数据库,出版物数据中心
点击其检索页面,随机选择一个分类,进行请求逻辑分析。
开发者工具得到的数据如下所示:
- 请求网址: http://爬虫地址/api/publisher/publisherVagueStatList
- 请求方法: POST
在请求头中,有一个特殊的参数,即 userSessionId
,该参数是用户登录之后的一个关键参数,通过 POSTMAN 进行测试发现无需该参数也可以调用到服务器数据。
其中请求表单参数说明如下:
pageNum
: 页码pageSize
: 每页数据keyword
: 搜索关键词city1
: 城市type
: 类型group
: 所属集团t
: pdc,ele,未知参数,保持默认值即可。
请求中没有加密参数,但是通过上图大家会发现响应中包含了一个加密参数,根据经验可以初步判断是 BASE64 加密形式,后期可以尝试从其入手。
⛳️ 解析参数
接下来添加 api/publisher/publisherVagueStatList
断点,刷新页面进入该断点。
跟随断点进入下述代码段,其中比较重要的函数是 i(e,u,o)
部分,而这个代码段又似曾相识,在前几篇博客 都是限制,都是秘密,JS 逆向某建筑市场数据,应该是看到过类似的结构。
js
var n = "getAllResponseHeaders" in f ? s(f.getAllResponseHeaders()) : null,
r = t.responseType && "text" !== t.responseType ? f.response : f.responseText,
o = {
data: r,
status: f.status,
statusText: f.statusText,
headers: n,
config: t,
request: f,
};
i(e, u, o), (f = null);
但是翻阅 i
函数内部之后,并未发现加密逻辑,难道经验出错了?
继续点击下述按钮,进入函数内部,查看函数体内的调用。
通过代码的反复调试,获取下图所示代码区域截图。
此时发现 function(t)
中的参数 t
已经被序列化,那前面的 e.responseHandle(t,!0)
就是我们唯一的突破点了,下图是被结构化的数据。
进入到 resoonseHandle
函数内部之后,发现了 e.result
逻辑,其中 result
属于关键参数。
选中前面的代码块之后,查看调用的 JS 文件,其中 chunk-common
显得至关重要。
当点击 JS 文件之后,直接就发现了下图所示代码。 加密参数都暴露在了我们面前。
js
o = function(t) {
var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "z66qa18l0w9o521k"
, i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "16-Bytes--String"
, a = s["enc"].Utf8.parse(e)
, n = s["enc"].Utf8.parse(i)
, o = s["AES"].decrypt(t, a, {
iv: n,
mode: s["mode"].CBC,
padding: s["pad"].Pkcs7
});
return o.toString(s["enc"].Utf8)
总结一下得到的结论,本案例采用的是 AEC-CBC 加密,iv
是 16-Bytes--String,密钥是 z66qa18l0w9o521k,其中 padding
是 Pkcs7
。
基于这些内容,我们已经可以将其逻辑 Python 话了,这一步你可以参考我们之前的博客,有很多落地方案。
📣📣📣📣📣📣 🌻 本文如果发现错误,欢迎在评论区中指正哦 💗
- 嗨,各位Python程序员,放弃selenium,试试年轻的Playwright如何?
- 09年的老电脑说想看一下CPU温度,作为Python工程师,怎能安装X大师?
- 如果你需要用Python搞个二维码,那应该收藏这篇博客
- 写给Python社群的第2课:Python逻辑语句,天天要写的 if 和 while
- 嗨,程序员,你知道高级工程师用的搜索引擎吗?
- 都2022年了,Python Web框架你不会只知道Django和Flask吧?
- 在座的Python爬虫工程师,你敢爬律师事务所站点吗?
- Python爬虫反爬,你应该从这篇博客开启,UA反爬,Cookie 特定参数反爬
- OpenGauss数据库在 CentOS 上的实践,配置篇
- 【Python技能树共建】动态渲染页面爬取
- 【Python技能树共建】Beautiful Soup
- 【首发字体反爬】猫X眼YingShi,我们又来欺负你了,用到了 OCR 识别技术
- 【首发】某易跟帖篇频道,接口溯源分析,反爬新技巧,必掌握一下
- 【首发】Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey
- 【首发】写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社
- 虎牙直播数据采集,为数据分析做储备,Python爬虫120例之第24例
- 我们的骄傲!非遗数据采集,来自官方的数据,Python爬虫无所不爬
- 3天掌握Flask开发项目系列博客之二,操作数据库
- 写给Python社群的第1课:初识Python,开篇知识点就选字符串吧~
- 升级【爸爸程序员】了?用Python给自己的宝贝下载200 绘本动画吧!