爬取目標
網址:有道翻譯

工具使用
開發工具:pycharm
開發環境:python3.7, Windows10
使用工具包:requests,random,hashlib
重點學習內容
-
網路請求的發送
-
js代碼除錯
-
js代碼決議逆向
專案思路決議
先區分資料的加載方式 請求資料時網址是沒有變化的 通過抓包獲取到動態資料
找到對應的資料介面 獲取到網頁的請求介面 請求方法是post請求

post需要提交的資料

可以明顯看出salt是時間戳 多個請求的資料進行比較 只有sign值是在不斷變化的加密資料 找到資料的加密規則 找到加密檔案

打上斷點找到對應加密資料的位置 除錯代碼進入斷點

sign值是由r.sign得來的 找到r的生成方式

找到最終的加密資料的位置

ts為時間戳 salt為時間戳加一個亂數 sign為MD5的加密方法生成的資料 sign是由時間戳的改變而改變的
明確加密的方式剩下的就是書寫代碼了
簡易原始碼分析
import requests
import time
import random
import hashlib
def main():
"""主程式"""
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-1808168645@10.108.160.208; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
}
i = input("請輸入你要的資料:")
"""獲取引數"""
lts = str(int(time.time()*100))
salt = lts + str(random.randint(0, 9))
content = "fanyideskweb" + i + salt + "]BjuETDhU)zqSxf-=B#7m"
sign = hashlib.md5(content.encode("utf-8")).hexdigest()
data = {
'action': 'FY_BY_CLICKBUTTION',
'bv': '9caf244986fe6d1de38207408302e500',
'client': 'fanyideskweb',
'doctype': 'json',
'from': 'AUTO',
'i': i,
'keyfrom': 'fanyi.web',
'lts': lts,
'salt': salt,
'sign': sign,
'smartresult': 'dict',
'to': 'AUTO',
'version': '2.1'
}
response = requests.post(url=url,headers=headers,data=data)
print(response.json()["translateResult"][0][0]["tgt"])
if __name__ == '__main__':
main()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291841.html
標籤:其他
