大家好,我是辣條,
這是我爬蟲實戰專案的第22篇,目標是寫到100篇,希望大家能關注這個專欄,
一個建筑行業的堂哥為了搞一些商業資料前前后后花了1w,辣條我半個小時就能解決的事情,這就是技術的魅力【爬取是的公開資料!】
爬取目標
網址:監管平臺

工具使用
開發工具:pycharm 開發環境:python3.7, Windows10 使用工具包:requests,AES,json
涉及AES對稱加密問題 需要 安裝node.js環境 使用npm install 安裝 crypto-js ?
專案思路決議
-
確定資料 在這個網頁可以看到資料是動態回傳的 但是 都是加密的 如何確定是我們需要的?

突然想到 如果我分頁 是不是會直接加載第二個頁面 然后查看相似度 找到第一個頁面, 我真是太聰明了

資料找到了 現在開始尋找加密 但是突然發現沒有 加密的關鍵字? 那我們通過url 下手試試 在All里面全域 搜索 query/comp/list(url后面的引數)

找到這個介面 滑鼠右鍵 可以在源代碼查看他



慢慢除錯 中間除錯太多了 我就不一一截圖出來了 跑到這里 發現data 里面的引數 和我們看到的加密一致
h(t.data) 加密位置

進去h里面 (滑鼠游標放到 h上面 會顯示他的 js地址 如果沒有顯示 就是證明你還沒有執行到這里 需要在前面打上斷點 重繪頁面除錯)

發現這個采用AES加密演算法 使用模型CBC模式 采用填充方式為 Pkcs7
AES.decrypt() # 引數說明 秘鑰 模式 偏移值 f = 'jo8j9wGw%6HbxfFn' # 秘鑰 m = '0123456789ABCDEF' # 偏移值
證明資料推導正確 在 return r.toString() 打上斷點

r里面資料正常回傳
簡易原始碼分享(后面保存沒有寫 可以自己嘗試 不會的 關注 私聊)
import requests
from Crypto.Cipher import AES
import json
?
?
url = 'http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?pg=2&pgsz=15&total=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38'
}
response = requests.get(url, headers=headers).text
f = 'jo8j9wGw%6HbxfFn' # 秘鑰
m = '0123456789ABCDEF' # 偏移值
?
# 轉碼 utf-8? 位元組 16進制
m = bytes(m, encoding='utf-8')
f = bytes(f, encoding='utf-8')
?
# 創建一個AES演算法 秘鑰 模式 偏移值
cipher = AES.new(f, AES.MODE_CBC, m)
# 解密
decrypt_content = cipher.decrypt(bytes.fromhex(response))
result = str(decrypt_content, encoding='utf-8')
?
# OKCS7 填充
length = len(result) # 字串長度
unpadding = ord(result[length - 1]) # 得到最后一個字串的ASCII
result = result[0:length - unpadding]
result = json.loads(result)['data']['list'] # dupms json.dumps() dict 格式 json的
# {"鍵":"值"}
?
for i in result:
print(i)
🍅 行業資料:關注即可領取PPT模板、簡歷模板、行業經典書籍PDF,
🍅 面試題庫:由技術群里的小伙伴們共同投稿,熱乎的大廠面試真題,持續更新中,
🍅 學習資料:含編程語言、演算法、大資料生態圈組件(Mysql、Hive、Spark、Flink)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299142.html
標籤:其他
