前言:

pm2.5的数据源比较多,但是历史数据比较少,很多网站不是很全,这个AQI空气质量数据网站的数据在同类网站中是算比较全面的了,界面也很简约清晰。一开始我爬取这个网站的时候看到网页结构很简单以为简单的构造请求就可以爬取数据了。没想到打开开发者工具后,发现其日数据是通过js加密解密加载到页面上的。

对于这样的网站第一反应是通过selenium用浏览器脚本对每个页面进行逐一加载。但是如果爬取的数据量很大,比如全国范围。逐一加载的时间开销比较大。我第一次爬取的时候就是通过开多线程用selenium爬取的,即使是开了多线程,速度还是不尽如人意。前后花了两个小时才把所有数据爬下来。所以这并不是完美的解决方式。

分析过程:

一个网站,要想把数据加载到页面上,无非是通过js 或者一些模板。我们先来逐一分析该网站的数据加载过程,如图

getServerData()获取数据后通过showTable()加载到页面上,整体来说还是比较常规的操作。可是在当前文件是找不到getServerData()的代码具体实现的。我们继续找其他js文件:通过搜索,我们在jquery.min.js中找到了类似的字段。

但是不要高兴的太早。我们发现,

该方法是混淆在js代码中的。现在我要找反混淆工具。把真正的代码找出来。

我们把截图中eval到注释部分的代码复制出来。然后找一个反混淆工具。我用的是这个:

http://www.bm8.com.cn/jsConfusion/

然后得到原本的js代码,复制保存到文本文件

分析该js文件。。。。(  下图是完整的getServerData()  )

我们发现该请求的参数和response都经过了加密解密。看到这里我们可以用execjs调用其中的加密解密方法,构造请求。就可以获取到我们需要的数据。

参数加密过程:

从图中可以看的很明白了,过程比较繁琐,没必要用python去实现一遍不如直接调用js方法。

response解密过程:

base64解码 》DES解码》AES解码》base64解码

这些方法都可以在该js中找到。有兴趣的可以去慢慢了解下。

下面是完整代码,爬取一个城市所有的历史数据:(js代码太多了就放github了)

代码地址:https://github.com/Crack-DanShiFu/apiStudy

import json
from lxml import etree
import execjs
import requests# 获取一个城市所有的历史数据  by lczCrack  qq1124241615# 加密参数
def encryption_params(city, date_time, ctx):method = 'GETDAYDATA'js = 'getEncryptedData("{0}", "{1}", "{2}")'.format(method, city, date_time)return ctx.eval(js)# 解码response对象
def decode_info(info, ctx):js = 'decodeData("{0}")'.format(info)data = ctx.eval(js)data = json.loads(data)return datadef get_response(params):url = 'https://www.aqistudy.cn/historydata/api/historyapi.php'headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8','Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'}data = {'hd': params}html_info = requests.post(url, data=data)return html_info.textdef get_city():url = 'https://www.aqistudy.cn/historydata/'html_info = requests.get(url)html = etree.HTML(html_info.text)  # 初始化生成一个XPath解析对象items = html.xpath('//div[@class="all"]//a/text()')return itemsdef get_all_info_by_city(city):years = [str(i + 2013) for i in range(7)]month = [str(i if i > 9 else '0' + str(i)) for i in range(1, 13)]node = execjs.get()ctx = node.compile(open('decrypt.js', encoding='utf-8').read())for y in years:for m in month:date_time = y + m  # 201805html_info = get_response(encryption_params(city, date_time, ctx))item = decode_info(html_info, ctx)for i in item['result']['data']['items']:print(i)if __name__ == '__main__':get_all_info_by_city('北京')#新代码请联系qq:1124241615

结果:

获取pm2.5空气质量AQI历史数据相关推荐

  1. PM2.5空气质量指数(AQI)是如何计算的

    源:PM2.5空气质量指数(AQI)是如何计算的 阅读目录 AQI如何计算 空气污染指数分级标准 AQI如何计算 具体要计算PM2.5空气质量指数(AQI),SENBE申贝技术人员向您介绍如何计算的公 ...

  2. (八)空气质量指数计算7.0-----beautifulsoup4解析处理html、获取所有城市空气质量

    案例描述 • 为了能有效地提取并利用网络信息并工作提高效率,出现了网络爬虫 • 利用网络爬虫实时获取城市的空气质量 • 利用beautifulsoup4获取所有城市的空气质量 案例解析 首先获取所有的 ...

  3. iOS版本PM2.5空气质量监控仪

    前言 鉴于柴静版<苍穹之下>的火爆,或许更多的人会关心环境,空气质量等环保因素,参考某学院的Swift版本的PM2.5的获取,本人自己写个Objective-C版本的. 基本原理 从服务器 ...

  4. python空气质量分析与预测_python 空气质量AQI数据分析与预测 ---分析,相关系数矩阵...

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/YmeBtc/article/details ...

  5. python 空气质量AQI数据分析与预测 ---分析(空气质量排名,临海城市空气质量是否优于内陆城市)

    #每天一点点# python 空气质量AQI数据分析与预测 点击可以查看 分析:用到的库,数据集,数据清洗 点击可以查看 分析:相关系数矩阵 #四:数据分析 #1:空气质量最好/最差的5个城市 #最好 ...

  6. Python基础学习教程:如何用Python来写pm2.5空气质量查询程序

    今天就教大家用之前有跟大家分享过的python基础学习教程完成首个MVP,如何用CLI(command-line interface,命令行界面)来执行第一个空气质量查询程序. 知识点 如何进行txt ...

  7. 如何用Python来写pm2.5空气质量查询程序

    今天就教大家用之前有跟大家分享过的python基础学习教程完成首个MVP,如何用CLI(command-line interface,命令行界面)来执行第一个空气质量查询程序. 知识点 如何进行txt ...

  8. python exit()什么意思_Python基础学习教程:如何用Python来写pm2.5空气质量查询程序...

    今天就教大家用之前有跟大家分享过的python基础学习教程完成首个MVP,如何用CLI(command-line interface,命令行界面)来执行第一个空气质量查询程序. 知识点 如何进行txt ...

  9. Python数据分析练习:北京、广州PM2.5空气质量分析(2)

    <接上一篇> 2. 数据分析 2.1 空气质量等级的对比分析 广州2015年与2016年的空气质量等级对比,分别统计全年各个等级的次数占比(例如:Good占比 = Good次数/全年总测量 ...

  10. 城市空气质量(AQI)数据爬虫

    全国各城市(网页上有的)空气质量爬虫,包括城市名称,AQI等信息,保存为.csv文件格式 网址首页:https://www.aqistudy.cn/historydata/index.php 首先是获 ...

最新文章

  1. 1-2-Active Directory 域服务准备概述
  2. 呵呵,又在这里开了个博客,现在已经有好几个了
  3. 案例实作图解.Net Entity Framework 教程
  4. [视频教程] 如何在Linux深度系统deepin下安装docker
  5. #1123-JSP隐含对象
  6. mysql --max_allowed_packet=32m_mysql 设置max_allowed_packet 大小的办法
  7. 官方中文文档上线了!Python各种教程已汉化。
  8. HDU 5045 Contest
  9. 用EnumMap代替序数索引
  10. asp.net学习之扩展GridView
  11. RH413--在RHEL6.4下测试nosuid和noexec选项
  12. 完全卸载mysql数据库
  13. Python的PIL库中的getpixel方法 putpixel方法
  14. 编码,隐匿在计算机软硬件背后的语言读书笔记(6/7/8)
  15. 常见的五种神经网络(4)-深度信念网络(下)篇之深度信念网络的原理解读、参数学习
  16. 判断字符串数组中的数字是否对称
  17. 中国都有哪些顶级优秀的程序员?
  18. 802.11成帧封装实现(五)
  19. 国际最新消息:Google 宣布成功攻破 SHA-1 加密
  20. python免注册大漠插件

热门文章

  1. GeoServer中使用SLD样式
  2. mysql blast2go,blast2go
  3. mysql 允许局域网连接_设置Mysql允许局域网或外部连接
  4. acme 生成通配符 SSL 证书
  5. 青出于蓝而胜于蓝 论AI大公司是拼不过小创企的
  6. MVC.MVVM.MVP的理解
  7. 哪种处理器能跑vs还有oracle,AMD处理器哪个最强 2020AMD处理器性能排行榜
  8. java实现科学计算器
  9. 通过ip地址连接局域网内的打印机(win7、win10)
  10. VRay(一)材质基础