中国空气质量在线监测分析平台数据获取 | 您所在的位置:网站首页 › 中国现在空气质量 › 中国空气质量在线监测分析平台数据获取 |
网站:https://www.aqistudy.cn/historydata/monthdata.php 空气质量在线检测分析平台 这个网站的数据获取我在网上查过别人的教程,比较繁琐,我有一个比较简单的方法获取数据,现在分享给大家 目标数据: 1.网站禁用F12和右键 —> 右上角三点 —>更多工具 —> 开发者工具 2.定时器debugger —> 一律不在此处暂停 3.分析数据接口,找xhr请求, 2.然后在原网页上查询别的城市天气数据,再查南京不会有xhr请求(估计是缓存了) 之前分析数据接口时可知, 拿数据的xhr请求为post请求,字段名即为:hA4Nse2cT, 由此可知,pKmSFk8就是密文,它是怎么生成 的? 看上面,就是poPBVxzNuafY8Yu函数所以我们要进入 poPBVxzNuafY8Yu 函数并分析加密过程,在上面那一句打上断点,重新发送请求 把网站的aes加解密扣下来,形成我的完整的模拟加密代码 var CryptoJS=require('crypto-js') const ask4u6FbhGV8 = "a0QHmC1Ova5958nC";//AESkey,可自定义 const asi2hhkBUJbo = "bMu71lHRX6bRmPxU";//密钥偏移量IV,可自定义 const acky6QolJSJi = "dLRSzDrm8xkryEyL";//AESkey,可自定义 const acixHVhiNqmK = "fex6AA4zRfVrSPmr";//密钥偏移量IV,可自定义 const dskQCqpdBOGo = "hEaIOlrX7tlhAOkz";//DESkey,可自定义 const dsiqYiQHbZQp = "xMBwDXG1HOubUV04";//密钥偏移量IV,可自定义 const dckCheMkUojW = "oi4aKMxMECWSyTaz";//DESkey,可自定义 const dciEekKS6Cws = "p2uRrSFcN9oKLrKY";//密钥偏移量IV,可自定义 var AES = { encrypt: function(text, key, iv) { var secretkey = (CryptoJS.MD5(key).toString()).substr(16, 16); var secretiv = (CryptoJS.MD5(iv).toString()).substr(0, 16); secretkey = CryptoJS.enc.Utf8.parse(secretkey); secretiv = CryptoJS.enc.Utf8.parse(secretiv); var result = CryptoJS.AES.encrypt(text, secretkey, { iv: secretiv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return result.toString(); }, decrypt: function(text, key, iv) { var secretkey = (CryptoJS.MD5(key).toString()).substr(16, 16); var secretiv = (CryptoJS.MD5(iv).toString()).substr(0, 16); secretkey = CryptoJS.enc.Utf8.parse(secretkey); secretiv = CryptoJS.enc.Utf8.parse(secretiv); var result = CryptoJS.AES.decrypt(text, secretkey, { iv: secretiv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return result.toString(CryptoJS.enc.Utf8); } }; var gethistory = (function(){ function osZ34YC04S(obj){ var newObject = {}; Object.keys(obj).sort().map(function(key){ newObject[key] = obj[key]; }); return newObject; } return function(name){ m0fhOhhGL='GETMONTHDATA' var oNLhNQ={city:name} var aMFs = '3c9208efcfb2f5b843eec8d96de6d48a'; var cVWG2 = 'WEB'; var t5GECZQ = new Date().getTime(); var pKmSFk8 = { appId: aMFs, method: m0fhOhhGL, timestamp: t5GECZQ, clienttype: cVWG2, object: oNLhNQ, secret: CryptoJS.MD5(aMFs + m0fhOhhGL + t5GECZQ + cVWG2 + JSON.stringify(osZ34YC04S(oNLhNQ))).toString(CryptoJS.enc.Hex) }; console.log(pKmSFk8.secret) pKmSFk8 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify(pKmSFk8))); pKmSFk8 = AES.encrypt(pKmSFk8, acky6QolJSJi, acixHVhiNqmK); return pKmSFk8; }; })(); 然后就是写py request,先用execjs调用js代码模拟加密后,发送密文给对应的API,看能不能获取到对应的加密数据,看获取的是不是与网站获取的相同 ```python import requests import execjs import json import requests cookies = { 'Hm_lvt_6088e7f72f5a363447d4bafe03026db8': '1704421259', 'Hm_lpvt_6088e7f72f5a363447d4bafe03026db8': '1704422591', } headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', # 'Cookie': 'Hm_lvt_6088e7f72f5a363447d4bafe03026db8=1704421259; Hm_lpvt_6088e7f72f5a363447d4bafe03026db8=1704422591', 'Referer': 'https://www.aqistudy.cn/historydata/', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } city="南京" with open("test.js", 'r',encoding='utf-8') as f: js_code = f.read() env=execjs.compile(js_code) history=env.call("gethistory",city) print(fuck) data = { 'hA4Nse2cT': history } response = requests.post('https://www.aqistudy.cn/historydata/api/historyapi.php', cookies=cookies, headers=headers, data=data) encrypted_data=response.text print(encrypted_data)这里我们选天津,看我们py拿到的数据跟网站发送拿到的是不是一样的, 网站的: 我拿到的: 可以发现是一样的,所以至此完成了发送数据的模拟加密 接收数据的解密: 接下来我们探索怎么解密拿到的数据 然后是构造请求和解析解密后数据的py代码: 执行js代码要PyExecJS2库,没有则执行,pip install PyExecJS2 完整的py代码 import execjs import requests # 要用自己的cookie cookies = { 'Hm_lvt_6088e7f72f5a363447d4bafe03026db8': '1704421259', 'Hm_lpvt_6088e7f72f5a363447d4bafe03026db8': '1704422591', } headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Referer': 'https://www.aqistudy.cn/historydata/', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } # 要查什么城市自己改这个参数即可 city="天津" # 读取js代码,构造js执行环境 with open("gethistory.js", 'r', encoding='utf-8') as f: js_code = f.read() env=execjs.compile(js_code) query=env.call("gethistory",city) data = { 'hA4Nse2cT': query } response = requests.post('https://www.aqistudy.cn/historydata/api/historyapi.php', cookies=cookies, headers=headers, data=data) encrypted_data=response.text result=(env.call("get_data",encrypted_data)) print(result) time_datas=result['items'] for time_data in time_datas: print(time_data)结果: 如果本文对您有帮助,请点个赞吧 |
CopyRight 2018-2019 实验室设备网 版权所有 |