写了那么久的博客,始于Python爬虫,目前专于Java学习,终于有了属于自己的小窝,欢迎各位访问我的个人网站,未来我们一起交流进步。

在前几天学习 Python 模拟登录知乎实例,其中关于涉及到了 fromdata 的加密处理,再学习的过程中,发现利用 chrome devtool调试分析网页还是有很多技巧需要学习,因此自己找了一个简单的实例用来学习 js 加密。

一、实例网站

本实例的网站是中国空气质量分析平台,学习利用 chome 浏览器的 devtool 工具对 fromdata 进行加密处理。

二、分析页面逻辑

1.抓包分析

用 chrome 打开该网页,然后按 F12 打开开发者工具 devtool,点击切换到“network”标签页。为了方便查看,先清除之前的请求过程,然后在网页上切换城市,即可看到新的 xhr 请求。

可以看到模拟登录 POST 的链接,我们最终的目标是构建 POST 请求所需的 headers 和 Form data 这两部分内容。

继续看 Requests Headers 信息,经过对不同城市的查询结果比对,发现 Headers 并未有什么独特的特征,因此我们仅先保留一部分必要信息。

接着,我们就需要考虑如何构建 Form data 数据。

2.调试分析

考虑到页面点击查询按钮时会发生网络请求,因此按钮肯定会有相应的时间处理。

在 html 文件中找到查询按钮的位置,接着我们定位到对应的 js 事件。

找到事件方法后,我们接着往下分析。

我们试着进入到 getAQIData() 方法中。

这里发现前台页面查询条件栏的数据,所以我们分析 getServerData 方法,在当前页面没有搜索到该方法的详细内容,因此我们进行全局搜索(ctrl+shift+F搜索)。

点击跳转到该 js 页面,搜索 getServerData 方法,发现并未搜到,网上查询发现网站为了混淆,该方法被放到了 jqury-1.8.0.min.js?v=1.2 文件中,而且经过混淆处理,可以利用在线工具来反混淆,如:https://beautifier.io/。

通过开发者工具进行断掉调试,进入 getServerData 方法中。

终于,我们看到了 Form Data ,可以看到该内容是由 getParm() 方法返回得到的。

3.加密分析

知道位置后,我们可以直接把这个加密的 js 方法都扣出来,放在一个 html 文件内执行就好。

var getParam = (function () {function ObjectSort(obj) {var newObject = {};Object.keys(obj).sort().map(function (key) {newObject[key] = obj[key]});return newObject}return function (method, obj) {var appId = '1a45f75b824b2dc628d5955356b5ef18';var clienttype = 'WEB';var timestamp = new Date().getTime();var param = {appId: appId,method: method,timestamp: timestamp,clienttype: clienttype,object: obj,secret: hex_md5(appId + method + timestamp + clienttype + JSON.stringify(ObjectSort(obj)))};param = BASE64.encrypt(JSON.stringify(param));return AES.encrypt(param, aes_client_key, aes_client_iv)}
})();

将该方法中涉及到的 js 方法一起提取出来,除了 jqury-1.8.0.min.js?v=1.2 文件中的必需方法之外,我们还需要将 city_detail.html 中的 getAQIData 方法提取出来,将所有的 JavaScript 放入到一个 html 文件,放在 script 标签内即可。

记得将查询条件数据放入到方法中。


在 js 中执行 document.write(getAQIData()),页面输出正确。

三、Python 实现加密

使用 python 的 execjs 来执行 JavaScript 代码,除了需要安装 execjs 包,还要安装 node 环境。具体安装可以参考网上教程。

    def encrypt(self, form_data):'''对查询条件栏的数据,进行加密:param form_data: 查询条件栏的数据,包括城市名称,开始结束时间等:return:加密后的字符串'''with open('encrypt.js',encoding='utf-8') as f:js = execjs.compile(f.read())return js.call('getAQIData',form_data)

在测试的过程中,如果遇到 execjs._exceptions.ProgramError: ReferenceError: localStorage is not defined 错误,localStorage 是浏览器端数据存储的方式之一,将 js 中相关代码注释掉,继续测试。

//加密
function getServerData(method, object, callback, period) {const key = hex_md5(method + JSON.stringify(object));// const data = getDataFromLocalStorage(key, period);// if (!data) {var param = getParam(method, object);return param// } else {//     callback(data)// }
}

成功输出结果。

四、Python 爬取网页

得到加密后的字符串后,需要将该内容通过 POST 请求提交到服务器,不过在实现的过程中,发现返回的内容与与前台返回的不一致。经过一番查询,

发现获取到的加密字符串内容只是与“view decoded”显示内容一致,我们尝试对数据进行 URL 编码,再进行 POST 请求。最终成功获得返回值。

接下来我们对返回的字符串进行解密,在分析 getServerData 方法分析中发现 decodeData 方法与解密有关。

    def decrypt(self, resp_text):'''对服务器请求成功后返回的数据,进行解密:param resp_text: 返回的数据:return:解密后的字符串,json格式'''with open('encrypt.js',encoding='utf-8') as f:js = execjs.compile(f.read())return js.call('decodeData',resp_text)

对服务器返回的内容进行解密处理,最后得到我们想要的数据。

详细代码请前往:https://github.com/Acorn2/SpiderCrack/tree/master/aqistudy

数据爬取 js 分析(一):Python 爬虫分析网页 js加密解密相关推荐

  1. 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)

    招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...

  2. 菜鸟弟弟从零开始的爬取Bilibili弹幕的Python爬虫教程-哔哩哔哩 - ( ゜- ゜)つロ 干杯~

    从零开始的爬取Bilibili弹幕的Python爬虫教程 或许可以作为一个爬虫小白的练手的demo? 还是先看看什么是爬虫吧!(还有Bilibili! ) 网络爬虫: 网络爬虫(又称为网页蜘蛛,网络机 ...

  3. 豆瓣新书速递数据爬取与简单数据处理 | 豆瓣爬虫 python pandas

    豆瓣新书速递数据爬取与简单数据处理 概要 数据爬取 爬取豆瓣平台提供的数据,存储到本地 json 文件. 数据说明 URL 豆瓣新书速推 HTML https://book.douban.com/la ...

  4. [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势

    思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图显示.情感分析.舆情分析.主题挖掘.威胁情报溯源.知识图谱.预测预警及AI和NL ...

  5. python爬取率_[新手]python爬虫爬取中证指数官网数据

    想用python爬虫获取中证指数官网上的几个主要指数的每日估值更新,但是下载下来的页面内容却没有想要的数据.想要的数据前面有个JavaScript标签,是不是光靠python没办法获取这个数据?求大神 ...

  6. python爬财务数据_同花顺财经-财务数据爬取思路详解-python爬虫

    同样的开头,近日,群友在讨论问题的时候发来一链接,询问如何抓取个股页面上财务指标,好奇心旺盛的博主立马打开网页研究了一番. 网址如下:http://stockpage.10jqka.com.cn/60 ...

  7. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

  8. 用python爬取豆瓣书评,简短Python爬虫爬取《人民的名义》豆瓣书评,附源代码和逐行解释...

    第一步,查看要爬取的网站:https://book.douban.com/subject/26952485/collections 明确要爬取的信息,以及查看对应的xpath 本爬虫提取如下的五条信息 ...

  9. python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  10. python爬取站_简单python爬虫练习 E站本爬取

    必备条件: 一台能上404的机子.. 过程: 由于也只是初学爬虫,个中技巧也不熟练,写的过程中的语法用法参考了很多文档和博客,我是对于当前搜索页用F12看过去..找到每个本子的地址再一层层下去最后下载 ...

最新文章

  1. c语言实验报告超市购物系统,C语言超市购物管理系统的报告.doc
  2. vue项目中阻止浏览器返回上一页
  3. caj文件浏览器_caj文件怎么转换成pdf文件?试试这样操作,3步成功转换
  4. .NET HttpClient的缺陷和文档错误让开发人员倍感沮丧
  5. [PHP] - 逗号和点号的区别
  6. Hibernate使用的一些细节注意事项
  7. (二)洞悉linux下的Netfilteriptables:内核中的ip_tables小觑
  8. 如何使用Navicat给表设置唯一索引
  9. 现代浏览器(HTML5)缓存接口文档收集
  10. C语言IDE和编辑器比较
  11. 鸡汤:【转载】超级高效术,让你的人生效率快人10倍
  12. PHP+实验室安全系统 毕业设计 -附源码191610
  13. 基于可见光通信的智慧路灯
  14. Pomodoro Technique番茄钟的理解
  15. R语言基础 期中考试
  16. 计算机职业生涯测评,皮纹检测职业版——职业生涯规划指南测评系统
  17. 判断全角与半角及两者之间的转换
  18. 微信群怎样加企业微信用户
  19. C++中sort()排序函数应用
  20. CentOS7安装MongoDB及基础操作

热门文章

  1. 百度杀毒+7654联盟
  2. 520情人节告白❤HTML+CSS+JavaScript实现抖音流动爱心
  3. 2017CS231n李飞飞深度视觉识别笔记(二)——图像分类
  4. 如何将分表汇总到总表_如何把多个Excel表格合并到一起,分表变,总表也自动更新?...
  5. 三地五中心(ldc(逻辑数据中心)单元化)和容灾
  6. 穷举法(枚举法)实例解析
  7. video-react
  8. Emlog资源吧V2.0模板
  9. python socket编程在阿里云的esc服务器下 [Errno 99] Cannot assign requested address解决方式
  10. python 乌龟绘图turtle模块的使用