归志宁无五亩园,读书本意在元元。这篇文章主要讲述写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社相关的知识,希望能为你提供帮助。
?? 实战场景本次要采集的是一个出版社相关的站点,目标站点相关信息如下所示:
- 站点域名:
aHR0cHM6Ly9wZGMuY2FwdWIuY24v
(Base64 编码) - 站点中文名称:图书出版社,出版社查询,出版机构数据库,出版物数据中心
文章图片
开发者工具得到的数据如下所示:
- 请求网址: https://爬虫地址/api/publisher/publisherVagueStatList
- 请求方法: POST
userSessionId
,该参数是用户登录之后的一个关键参数,通过 POSTMAN 进行测试发现无需该参数也可以调用到服务器数据。文章图片
其中请求表单参数说明如下:
pageNum
: 页码pageSize
: 每页数据keyword
: 搜索关键词city1
: 城市type
: 类型group
: 所属集团t
: pdc,ele,未知参数,保持默认值即可。
?? 解析参数接下来添加
api/publisher/publisherVagueStatList
断点,刷新页面进入该断点。文章图片
跟随断点进入下述代码段,其中比较重要的函数是
i(e,u,o)
部分,而这个代码段又似曾相识,在前几篇博客 都是限制,都是秘密,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 文件之后,直接就发现了下图所示代码。
文章图片
加密参数都暴露在了我们面前。
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 话了,这一步你可以参考我们之前的博客,有很多落地方案。
推荐阅读
- pfSense使用证书认证配置IPsec站点到站点隧道指南
- linux运维的发展方向
- Spark SQL底层执行流程详解
- #yyds干货盘点element-tree-grid(表格树)的使用
- MOS管和IGBT有什么区别(别傻傻分不清了)
- C语言-细说函数与结构体
- k8s中nginx+tomcat实现动静分离
- C语言程序的环境,编译+链接
- ENSP三层交换机连接二层交换机及路由器的做法