4

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社

 2 years ago
source link: https://blog.51cto.com/cnca/5236784
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗
🌻 爬虫圈的一个初中生 👍
🌻 Python 圈的一个老师傅 💗
👍 如果文章有帮助,就帮我水两句评论吧 👍
📣📣📣📣📣📣

⛳️ 实战场景

本次要采集的是一个出版社相关的站点,目标站点相关信息如下所示:

  • 站点域名:aHR0cHM6Ly9wZGMuY2FwdWIuY24v (Base64 编码)
  • 站点中文名称:图书出版社,出版社查询,出版机构数据库,出版物数据中心

点击其检索页面,随机选择一个分类,进行请求逻辑分析。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_python爬虫
开发者工具得到的数据如下所示:

在请求头中,有一个特殊的参数,即 userSessionId,该参数是用户登录之后的一个关键参数,通过 POSTMAN 进行测试发现无需该参数也可以调用到服务器数据。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据_02

其中请求表单参数说明如下:

  • pageNum: 页码
  • pageSize: 每页数据
  • keyword: 搜索关键词
  • city1: 城市
  • type: 类型
  • group: 所属集团
  • t: pdc,ele,未知参数,保持默认值即可。

请求中没有加密参数,但是通过上图大家会发现响应中包含了一个加密参数,根据经验可以初步判断是 BASE64 加密形式,后期可以尝试从其入手。

⛳️ 解析参数

接下来添加 api/publisher/publisherVagueStatList 断点,刷新页面进入该断点。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据加密_03

跟随断点进入下述代码段,其中比较重要的函数是 i(e,u,o) 部分,而这个代码段又似曾相识,在前几篇博客 都是限制,都是秘密,JS 逆向某建筑市场数据应该是看到过类似的结构。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据_04

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 函数内部之后,并未发现加密逻辑,难道经验出错了?

继续点击下述按钮,进入函数内部,查看函数体内的调用。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据_05

通过代码的反复调试,获取下图所示代码区域截图。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据_06

此时发现 function(t) 中的参数 t 已经被序列化,那前面的 e.responseHandle(t,!0) 就是我们唯一的突破点了,下图是被结构化的数据。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据_07

进入到 resoonseHandle 函数内部之后,发现了 e.result 逻辑,其中 result 属于关键参数。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_python爬虫_08

选中前面的代码块之后,查看调用的 JS 文件,其中 chunk-common 显得至关重要。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据加密_09

当点击 JS 文件之后,直接就发现了下图所示代码。

写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社_数据加密_10

加密参数都暴露在了我们面前。

 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 加密,iv16-Bytes–String,密钥是 z66qa18l0w9o521k,其中 paddingPkcs7

基于这些内容,我们已经可以将其逻辑 Python 话了,这一步你可以参考我们之前的博客,有很多落地方案。

📣📣📣📣📣📣
🌻 本文如果发现错误,欢迎在评论区中指正哦 💗


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK