目录
本次爬取仅供学习交流,无任何商业用途,目标网址已做脱敏处理!
目标网址:aHR0cDovL2p6c2MubW9odXJkLmdvdi5jbi9kYXRhL2NvbXBhbnk=
一、寻找加密源码
抓包分析可知,原数据已被加密成长串字符。之前的博客已分析过,这种可能是JSON加密过的。因此,搜索Json.parse
函数,最终定位到JS文件如下所示
跟进JS文件后,继续搜索Json.parse
,最终定位到935行,在此打断点刷新,发现h函数就是最终的加密函数!
继续跟进h函数,可获得如下的加密逻辑
二、引入CryptoJS模块
在定位到加密逻辑后,现对该逻辑展开分析。之前的博客是继续跟进相应的函数,进行查漏补缺,不断完善。本次通过观察代码中出现AES.decrypt
,可判断为AES加密。此时,可以引用常见的加解密模块——CryptoJS。现重写加密逻辑,并保存为jscode.js
文件,如下所示
var CryptoJS = require("crypto-js")
function Parse_Data(t) {
var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF"),
f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),
e = CryptoJS.enc.Hex.parse(t),
n = CryptoJS.enc.Base64.stringify(e),
a = CryptoJS.AES.decrypt(n, f, {
iv: m,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}),
r = a.toString(CryptoJS.enc.Utf8);
return r.toString()
}
注意:
- CryptoJS模块需要安装node.js,安装及环境配置可参照博客node.js安装教程
- 安装后,需在cmd以管理员模式中安装CryptoJS模块,命令如下
npm install crypto-js
三、Python解密
现用Python中的execjs
库执行上述JS代码,实现解密。
import requests
import execjs
import json
def get_text(url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
'cookies': 'Hm_lvt_b1b4b9ea61b6f1627192160766a9c55c=1647842220,1647842596; Hm_lpvt_b1b4b9ea61b6f1627192160766a9c55c=1647842596'
}
data = {'pg': 0, 'pgsz': 15, 'total': 450}
r = requests.get(url, headers=headers, params=data)
return r.text
def load_jscode(js_path):
with open(js_path, 'r', encoding='utf-8') as f:
js_code = f.read()
return js_code
if __name__ == "__main__":
url = 'http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?'
r_text = get_text(url)
js_code = load_jscode("jscode.js")
rst = execjs.compile(js_code).call("Parse_Data",r_text)
print(rst)
解密结果如下,成功返回数据!(注意:如果出现编码格式错误,可参照该博客execjs执行编码格式错误解决方法,修改_external_runtime.py文件)
四、全部代码
整理输出数据格式,现将全部代码整理如下
import requests
import execjs
import json
from jsonpath import jsonpath
import pandas as pd
def get_text(url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
'cookies': 'Hm_lvt_b1b4b9ea61b6f1627192160766a9c55c=1647842220,1647842596; Hm_lpvt_b1b4b9ea61b6f1627192160766a9c55c=1647842596'
}
data = {'pg': 0, 'pgsz': 15, 'total': 450}
r = requests.get(url, headers=headers, params=data)
return r.text
def load_jscode(js_path):
with open(js_path, 'r', encoding='utf-8') as f:
js_code = f.read()
return js_code
def save_data(json_data):
org_code = jsonpath(json_data, "$..list[*].QY_ORG_CODE")
company_name = jsonpath(json_data, "$..list[*].QY_NAME")
company_represent = jsonpath(json_data, "$..list[*].QY_FR_NAME")
company_loc = jsonpath(json_data, "$..list[*].QY_REGION_NAME")
final_data = pd.DataFrame({
"社会信用代码": org_code,
"企业名称": company_name,
"法人代表": company_represent,
"企业地址": company_loc}
)
final_data.to_csv("company_information.csv",encoding='gbk',index=False)
if __name__ == "__main__":
url = 'http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?'
r_text = get_text(url)
js_code = load_jscode("jscode.js")
rst = execjs.compile(js_code).call("Parse_Data", r_text)
json_data = json.loads(rst)
save_data(json_data)
最终数据如下
以上就是本次分享的全部内容~