中国空气质量在线监测平台(https://www.aqistudy.cn/html/city_detail.html)在众多的练习中,关闭了前台数据信息的展示,也就是说现在网页是这样的:

但我们主要学习的是如何应对js加密,而不是数据,前者学会了,数据哼!这个网站使用了js对参数进行了加密,js加密的过程还进行了混淆,我们根本看不懂,但是我们可以使用一些js反混淆平台,对js代码进行反混淆,你可以直接百度搜索在线js反混淆。反混淆我们也不可能实现参数的重构,还需要借助它本身的js代码来进行参数解密,所以这里使用PyExecJS 库来实现模拟JavaScript代码执行获取动态加密的请求参数,然后再将加密的响应数据带入decodeData进行解密即可!后面用到在详细说明。

对于所有的爬虫来说,发送一个请求,参数是最关键的吗。一般来说网站都会对个别参数进行处理,让你不能随随便便就知道参数拿来的,你可以看一这篇文章:Web端虾米音乐爬虫实战分析 处理参数JS加密,它就是简单的对参数做了一个md5加密,这个我们可以重构参数,也比较简单。

想要完全理解中国空气质量在线监测平台的加密方式,你需要补充一些ajax的知识。我们在它首页进行简单的搜索,你可以看到页面不刷新,但是发送了请求,那么说明网站使用的是ajax或者是jQuery发送的请求。我们需要对此进行分析。

关键就是参数d的来源,我们需要知道它是如何生成的。对于搜索按钮,绑定了click的点击事件才会发送请求,所有我们从这个click点击事件来突破。通过火狐浏览器查找click事件的函数,然后使用chrome浏览器进行全局搜索(万能)查看:

谷歌的全局搜索非常好用,我们直接搜索click事件的函数getData,然后再这几个js文件中进行分析,这就需要要求你能看懂一点点js代码才行。这里搜索出了4个js文件,那么可以简单看一下,先看function getData()这个函数,发现它里面没有值得关注的代码,但是看到了两个函数getAQIData()、getWeatherData()

getData函数内部调用了getAQIData()和getWeatherData(),正好就在下面,我们可以简单看一下。在getAQIData()和getWeatherData()两个函数内部都调用了getServerData函数,这个函数非常的特别,代码不简单呐,现在刷新一下页面然后全局搜一下getServerData方法,结果如图:

你应该会毫不犹豫的打开jQuery中的getServerData函数吧!然后再这个js文件中定位它,你会发现它都是一些数字加|的代码,getServerData就在中间,其它的都看不懂。其实这里是经过JavaScript 混淆加密了,混淆加密之后,代码将变为不可读的形式,但是功能是完全一致的,这是一种常见的 JavaScript 加密手段。我们想要查看到该方法的原始实现则必须对其进行反混淆。

反混淆:JavaScript 混淆之后,其实是有反混淆方法的,最简单的方法便是搜索在线反混淆网站,在这里不提供网址(https://beautifier.io/),网址可能会挂掉,所以你自己百度搜索一下。我们可以将getServerData存在的这行数据粘贴到反混淆的网站中。

在反混淆后,我们很清晰的看到了ajax请求发送的实现。然后还看到了ajax对应post请求的动态加密请求参数的加密方法getParam(),并且将method和object作为了函数的参数。method和object是从getServerData函数的参数中获取的,那么getServerData函数中的method和object表示的是什么呢?我们需要回过头去查看刚才调用getServerData的函数getAQIData和getData,这里发现method是固定形式字符串,object就是param是一个字典,里面存储了三组键值对city表示查询城市名称,startTime和endTime为查询起止时间,type表示为HOUR:

getParam()函数中的两个参数的表示含义我们已经清楚了。getParam函数的返回值就是ajax对应post请求的动态加密请求参数了,我们需要定位到其函数内部的实现,看看是如何对请求参数进行加密的。在getServerData中我们发现了ajax请求对应的操作代码,其中还有一个非常重要的一步,就是ajax请求成功后的回调函数实现内部,接受到了响应数据data,data我们知道是一组密文数据,然后调用了decodeData对data进行了解密操作

在getParam函数内部使用了 Base64 和 AES 对param进行加密。加密之后的字符串便作为ajax对应post的请求参数传送给服务器了。

现在我们呢知道了加密方法,那么现在应该有两种方式解决:

一、可以将js函数改写为Python函数二、使用相关模块进行js逆向。

PyExecJS 是一个可以使用 Python 来模拟运行 JavaScript 的库。我们需要pip install PyExecJS对其进行环境安装。除此之外还需要安装nodejs的开发环境。

这里我喜欢第二种方式,那么首先需要安装PyExecJs,接着需要将待执行的js函数全部定义存储到一个js文件中,模拟执行js源文件的js函数。加载js源文件中的代码并将其重新编译,在这里需要在刚才反混淆的代码中定义一个函数getPostParamCode,它接收五个参数,参数我们在前面的getAQIData函数可以知道是什么:

这里的test.js文件,你可以直接把反混淆过的jquery全部拿过来。如果运行代码报错:execjs._exceptions.RuntimeError: SyntaxError: 语法错误,需要修改node的驱动,默认是JScript:

到此我们已经成功的构造出d参数,那么一切就变得简单了,再使用reuqests携带上参数发送post请求就可以获取数据,只需要在上面的代码中添加一下发送请求的代码即可:

由于网站已经崩了,所以数据不重要了,主要的是如何应对js加密,你学会了吗!

python爬虫js逆向加密,Web爬虫处理参数js加密、js混淆、js逆向相关推荐

  1. 用python写一个简单的爬虫_Python实现简易Web爬虫详解

    编辑推荐: 本文主要介绍了Python实现简易Web爬虫详解,希望对大家有帮助. 本文来自于脚本之家 ,由火龙果软件Alice编辑,推荐. 简介: 网络爬虫(又被称为网页蜘蛛),网络机器人,是一种按照 ...

  2. java url参数加密_针对url参数的加密解密算法(原创)

    基本思路是:前端对参数进行加密,并经过urlrewriter进行地址改写传入后台,后台再进行解密.如:对这样一个url--‍‍‍‍http://1.1.1.1:8080/a.do?param=1,加密 ...

  3. 使用Python的Scrapy框架编写web爬虫的简单示例

    2019独角兽企业重金招聘Python工程师标准>>> 在这个教材中,我们假定你已经安装了Scrapy.假如你没有安装,你可以参考这个安装指南. 我们将会用开放目录项目(dmoz)作 ...

  4. android爬虫_进行Android Web爬虫改造

    android爬虫 In this tutorial, we'll be implementing Web Scraping in our Android Application. We will b ...

  5. 加密 web.config

    1.打开记事本,然后将下面的代码复制到一个新文件中. <%@ Page Language="C#" %><%Response.Write(System.Secur ...

  6. 极验第四代滑块验证码破解(一):AST还原混淆JS

    极验第四代滑块验证码破解(一):AST还原混淆JS 声明 一.环境安装 二.AST还原混淆JS 1. 需要还原的js代码链接 2. AST还原源码 3. 极验不同js或不同版本还原方式 三.结语 *本 ...

  7. Python爬虫入门之淘宝JS逆向解析请求参数Sign加密(一)

    关于JS逆向,相信这是很多小伙伴学习爬虫的一个门槛之一,如果你是初学者入门,开发一款爬虫,要以思路为主,代码是其次的 这里所说的思路指两个方面,一,分析观察目标站点思路,二,代码开发思路,二者缺一不可 ...

  8. python爬虫处理js混淆加密_Python爬虫—破解JS加密的Cookie

    專 欄 ❈Jerry,Python中文社区专栏作者. blog:https://my.oschina.net/jhao104/blog github:https://github.com/jhao10 ...

  9. Python爬虫进阶必备 | 关于某查猫查询参数的加密逻辑分析

    关于某查猫查询参数的加密逻辑分析 先上链接: aHR0cHM6Ly93d3cucWljaGFtYW8uY29tLw== 抓包分析 找到要分析的参数,通过首页的检索栏,输入企业名称关键字点击查询就可以抓 ...

最新文章

  1. 玩转社区开源贡献,看这篇就够了!
  2. 月薪8k和月薪38K的程序员差距在哪里?
  3. VS2017配置opencv教程(图文详解)
  4. Python基本语法元素之温度转换
  5. 推荐一款软件(作业)
  6. asterisk版本选择
  7. linux虚拟机设置固定IP的方法
  8. js操作select标签
  9. Python安装(一)-Linux下安装Python
  10. 矩阵平均路径长度_Android自定义View-路径动画
  11. PAT乙级 1005 继续(3n+1)猜想 (25分)
  12. 只需1分钟,这个网站用AI分离歌曲的人声、伴奏和乐器声
  13. DTCMS添加栏目教程
  14. 克隆硬盘后进不去系统_Windows 10克隆后ssd硬盘不能引导启动
  15. android 腾讯云聊天,腾讯云视频通话
  16. 解决: 在类xxx 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[]
  17. utc时间戳java_java利用时间戳来获取UTC时间
  18. java修改密码代码_Java用户修改密码
  19. garch dcc用matlab,MATLAB DCC-GARCH
  20. 【CSS3】object-fit与object-position及替换元素

热门文章

  1. 一个低成本构建电商平台的方案
  2. 一篇带你了解动态规划问题
  3. 【MATLAB】判断语句和循环语句
  4. openlayers3教程详细_OpenLayers 3 入门教程
  5. 周鸿祎做客天天向上 奇虎“三娘”是否出境成谜
  6. 【软路由】J4125安装PVE7.3+iKuai+OpenWrt+NAS+Win10+Debian+CentOS
  7. 一道很有意思的面试题目,快加入到这场头脑风暴游戏里吧~
  8. TCP/IP四层模型及功能
  9. 导入Excel文件的各种常见方法
  10. unity文件存储和读取