python爬虫简单js逆向案例
在学习时需要用到数据,学习了python爬虫知识,但是在用爬虫程序的时候就遇到了问题。具体如下,在查看请求数据时发现返回的数据是加密的信息,现将处理过程记录如下,以便大家学习交流。

内容简介

需求:爬取某企科技网站投资事件栏目https://qimingpian.cn/finosda/project/einvestment的数据。

出现问题:获取数据首先需要发送请求,得到响应数据 。通过网页分析可知,需要获取的数据来自ajax发送POST请求动态获取,所以我选择通过向ajax的url发送请求得到响应数据。得到的返回数据是加密的,如下图所示。

解决办法:通过分析浏览器请求到的相关js文件,找到解码部分代码,通过调用python中的js库execjs执行js代码

1.根据其关键字 encrypt_data进行全局搜索,寻找js的解密代码

2.找到 return t.encrypt_data && (t.data = Object(d.a)(t.encrypt_data))

此处得到的代码就是解密encrypt_data。在引处打断点,然后点击跳入。

3.找到解析方法:

function s(e) {
return JSON.parse(o("5e5062e82f15fe4ca9d24bc5", a.a.decode(e), 0, 0, "012345677890123", 1))
}

4.调试到这里的时候参数e已经是之前接口中获取到的加密数据,通过JSON.parse转为json对象返回。

接下来重点分析这个区域的代码,可以看到,只有a.a.decode(e)调用了e,所以这个地方需要生成两个函数,一个是o(六个参数),另一个是其包含的这个函数decode(一个参数,也就是前面接口中获取到的encrypt_data),其他都是固定的字符串,将此方法o的js定义直接复制过来就行了

上面就是方法o的具体定义了,然后我们再找找decode方法。

5.按照上面的方法找到decode方法,查看decode方法定义,其中用到两个变量f,c,其初始值在上方,替换即可。到此我们就把这两个方法定义全部搞定了。

接下来再根据网站中的逻辑将加密数据解密,我们自己写一个返回的方法。

function decrypt(t){
return JSON.parse(o("5e5062e82f15fe4ca9d24bc5", decode(t), 0, 0, "012345677890123", 1))
}

6.将上面的方法o和decode,以及decrypt方法写入qiming.js

然后在Python代码中使用execjs调用js中的方法就可以了。

    with open("qiming.js", encoding='utf-8') as f:
js_code = f.read() ctx = execjs.compile(js_code)
decrapy_data = ctx.call("decrypt", encrypt_data)

  

至此,数据已解密出来,接下来请继续做其它的处理操作。

最新文章

  1. angularjs服务-service
  2. listener does not currently know of SID项目部署报数据库错
  3. 配置RAC到单节点standby的data guard
  4. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
  5. 【JS复习笔记】04 数组
  6. ExtJS学习之路第八步:Window组件
  7. Spring注解【非单例】
  8. javascript中bind,apply,call的相同和不同之处
  9. css选择器优化
  10. penetration testers渗透测试,hack,vnc,nat,
  11. ThoughtWorks开发持续集成及部署利器:Go
  12. 设计模式-模板方法模式(Head First)
  13. Label 和 checkbox 不为人知的小秘密
  14. 私有仓库 gitlab 部署笔记
  15. angular4 富文本编辑器
  16. RFM模型
  17. day5_函数返回值
  18. Javascript 面向对象编程2:构造函数的继承
  19. 为什么byte的取值范围是-128到127
  20. mySql的desc与explain分析性能(主要分析索引)

热门文章

  1. OllyDbg---数学指令
  2. Java中List接口重要实现类一ArrayList
  3. 『现学现忘』Git基础 — 2、Git和SVN的区别
  4. QT类使用记录
  5. android软件简约记账app开发day06-将记账条目添加到数据库并且绘制备注页面
  6. docker基础_网络模式
  7. Python连接数据库,列表输出数据库中的某一列
  8. 关于在PyCharm中import numpy 出现from . import _mklinit ImportError: DLL load failed: 找不到指定模块
  9. npm install xxxx --legacy-peer-deps命令是什么?
  10. javaScript中Math内置对象基本方法入门