目录
一、代码和具体结果展现
1.1python代码展现
import csv
import requests
import execjs
import json
import time
f = open('全国建筑公司信息.csv','w',encoding='utf-8',newline='')
csv_writer = csv.DictWriter(f,fieldnames=[
'统一社会信用代码',
'企业名称',
'企业法定代表人',
'企业注册属地',
'COLLECT_TIME',
'RN',
'QY_ID',
'OLD_CODE',
])
csv_writer.writeheader()
cookies = {
'Hm_lvt_b1b4b9ea61b6f1627192160766a9c55c': '1710333577,1710398146',
'Hm_lpvt_b1b4b9ea61b6f1627192160766a9c55c': '1710398146',
}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
# 'Cookie': 'Hm_lvt_b1b4b9ea61b6f1627192160766a9c55c=1710333577,1710398146; Hm_lpvt_b1b4b9ea61b6f1627192160766a9c55c=1710398146',
'Referer': 'https://jzsc.mohurd.gov.cn/data/company',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'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',
'accessToken': '',
'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"',
'timeout': '30000',
'v': '231012',
}
for page in range(1,30):
time.sleep(1)
params = {
'pg': page,
'pgsz': '15',
'total': '450',
}
response = requests.get(
'https://jzsc.mohurd.gov.cn/APi/webApi/dataservice/query/comp/list',params=params,cookies=cookies, headers=headers,).text
js_file = execjs.compile(open('爬取全国建筑公司信息.js','r',encoding='utf-8').read())
json_data = json.loads(js_file.call('b',response))
for index in json_data['data']['list']:
dit = {
'统一社会信用代码':index['QY_ORG_CODE'],
'企业名称':index['QY_NAME'],
'企业法定代表人':index['QY_FR_NAME'],
'企业注册属地':index['QY_REGION_NAME'],
'COLLECT_TIME':index['COLLECT_TIME'],
'RN':index['RN'],
'QY_ID':index['QY_ID'],
'OLD_CODE':index['OLD_CODE'],
}
print(dit)
csv_writer.writerow(dit)
print(f'正在打印第{page}页数据---------------------------------------------------------------')
1.2js代码展现
const CryptoJS = require('crypto-js');
var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF");
var f = CryptoJS.enc.Utf8.parse("Dt8j9wGw%6HbxfFn");
function b(t) {
var 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()
}
1.3爬取结果展现
二、如何获取数据包和解析
2.1抓包
点击开发者工具-网络-XHR,刷新页面,可以获得一连串数据包,在预览处,发现结果位密文数据,因此需要解密。
2.2逆向实现:
点击一个包,查看启动器,点击第一个,进入js代码
按规律,一般在send处打上断点,然后点击下一页
在堆栈处,逐个往上检索,在有嫌疑的地方打上断点
跳转这个断点,发现密文
然后点击跳过下一个函数调用(按多次),即第二个函数按钮
然后跳转到这里,打上断点,并释放其他断点,在网页上点击分页。
发现了明文数据,跳转到函数
在函数页面,复制函数,和必要的参数,发现其为标准AES解密算法,在js库中,用专门的库解密即可。
2.2注意事项
上面复制的f是错误的,在这个函数下面不远处,有真正的f
2.3便捷方法
在搜索框输入decrypt(即可快速跳转到该函数。
2.4详细步骤视频讲解链接
【Python爬取全国建筑公司信息,实现数据可视化-哔哩哔哩】 https://b23.tv/HTWhQaE