爬虫模拟对“有道在线翻译”发送请求(请求中的数据含需分析js来解出变化数据)
每日分享:
做好自己
世界上沒有一份工作不辛苦,也沒有一處人事不復(fù)雜,無論你當下正在經(jīng)歷什么,都要調(diào)整好心態(tài),繼續(xù)前行,繼續(xù)努力!
總有人嫌你不夠好,也總有人覺得你哪里都好,愛你的人自然會愛你,不愛你的人做再多也是錯。
在長大、在失去、在努力、在接受、在好好生活。
不會js也可以解出來!!!
- 分析構(gòu)建data數(shù)據(jù)
- 編寫代碼
一、分析js構(gòu)建data數(shù)據(jù)(主要講解)
1. 在隱身窗口或無痕模式登錄有道在線翻譯:在線翻譯_有道
2. 抓包 -> 輸入要翻譯的句子
3. 再新建一個隱身窗口執(zhí)行步驟2,找到translate包,觀察兩次的Form Data有什么不同:
?可以看到,表單中的 salt、sign、lts 這三個數(shù)據(jù)是變化的
4. 找到對應(yīng)的js文件:
可以看到,js文件是同一個文件(后面的數(shù)字代表位置是在多少行) ,隨意打開一個就行
5. 找一個Form Data中比較特殊的詞,例如:smartresult(不要找像第一個數(shù)據(jù) i ,因為 i 很可能會在js代碼中出現(xiàn)很多次),之后直接在js代碼中查找(Ctrl+f),找到如下代碼:
很明顯可以看出,它就是js中構(gòu)建Form Data的部分代碼,我們可以根據(jù)它來分析?salt、sign、lts 這三個數(shù)據(jù)是如何得到的
6. 觀察這三個數(shù)據(jù),可以發(fā)現(xiàn),它們都與 r 有關(guān):
?7. 之后就找 r 是什么,往上滑可以看到如下代碼:
所以,r 肯定與generateSaltSign這個函數(shù)有關(guān)
8. 通過查找(Ctrl+f)generateSaltSign這個關(guān)鍵詞,可以找到generateSaltSign函數(shù)是怎么來的(其他的地方都是調(diào)用這個函數(shù)):
?9. 我們可以發(fā)現(xiàn),這行代碼是把 r 的值給了generateSaltSign函數(shù),那么說明,在這個大括號里(這一塊代碼)肯定有 r 的值,因此就在大括號中找 r 即可:
可以看出,劃線代碼就是 r 的定義
10.? 可以在 r 的定義中找到?salt、sign、lts 這三個變化參數(shù)的來源:
lts:其實lts就是代碼中的ts:
?看lts的值:1638699280543,看到這一串數(shù)字要想到“時間戳”(也就是時間)
ts的值是 r 的值,而 r = "" + (new Date).getTime(),沒學(xué)過js看不懂也沒關(guān)系,我們可以復(fù)制這個語句:(new Date).getTime(),在如下圖輸入js代碼:
?如上就是得到的結(jié)果,可以推斷出,這行代碼的作用就是獲得時間戳;ts就是把時間戳變成了字符串類型,ts與lts數(shù)字的個數(shù)也一致,可以推斷它們是一樣的。
salt:細心的小伙伴可以發(fā)現(xiàn),salt比lts就多了一位數(shù)字
salt的值就是 i 而 i =?r + parseInt(10 * Math.random(), 10);其中r是時間戳,后面代碼又看不懂了,繼續(xù)在Console中多次輸入parseInt(10 * Math.random(), 10):
多次輸入后你會發(fā)現(xiàn),它是產(chǎn)生一個0-9的int型數(shù)據(jù)(沒有10),也就是說salt的值就是lts的值后面加上了一個隨機數(shù)
sign:首先可以看出它是十六進制
sign =?n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")
先說一下該表達式中的e:
我們可以想一下,什么東西這么重要,使js代碼中特別多的參數(shù)都是e,當然就是要翻譯的詞/句子了。
解析sign就需要我們知道python了,python中的hashlib模塊中有md5方法
這兩個是最常見的方法
下面通過代碼,來了解md5:
import hashlib # 進行hash運算的數(shù)據(jù) data = 'python' # 創(chuàng)建hash對象 md5 = hashlib.md5() # 向hash對象中添加需要做hash運算的字符串 md5.update(data.encode()) # 獲取字符串的hash值(十六進制輸出) result = md5.hexdigest() print(result)?結(jié)果:
在數(shù)據(jù)不是特別特別特別......大的時候,一個data對應(yīng)一個md5后的值,一般不會出現(xiàn)重復(fù)
到此為止,Form Data 里面的值就都解決了,接下來寫代碼即可
二、源碼
import requests import hashlib import time import random import json from jsonpath import jsonpath # 編寫代碼步驟: # url # headers # form_data # 發(fā)送請求,獲取響應(yīng) # 解析數(shù)據(jù)(Response為json數(shù)據(jù))class You_dao(object):def __init__(self, word):self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'self.headers = {'User-Agent': '改為你的U-A','Referer': '改為你的Referer','Cookie': '改為你的Cookie'}self.form_data = Noneself.word = word# 獲取數(shù)據(jù)def generate_form_data(self):"""ts: "" + (new Date).getTime()salt: ts + parseInt(10 * Math.random(), 10);sign: n.md5("fanyideskweb" + word + salt + "Y2FYu%TNSbMCxc3t2u^XT")"""lts = str(int(time.time()*1000))salt = lts + str(random.randint(0, 9))data = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"md5 = hashlib.md5()md5.update(data.encode())sign = md5.hexdigest()# 構(gòu)建表單數(shù)據(jù)self.form_data = {'i': self.word,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': salt,'sign': sign,'lts': lts,'bv': '318dde5ec635786619012045ee59bf8a','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}def get_data(self):response = requests.post(url=self.url, headers=self.headers, data=self.form_data)return response.contentdef run(self):self.generate_form_data()# 得到的數(shù)據(jù)為json類型data = self.get_data()# 將json轉(zhuǎn)化為字典data = json.loads(data)data = jsonpath(data, '$..tgt')[0]print(data)if __name__ == '__main__':Word = input('輸入要翻譯的單詞或句子:')you_dao = You_dao(Word)you_dao.run()總結(jié)
以上是生活随笔為你收集整理的爬虫模拟对“有道在线翻译”发送请求(请求中的数据含需分析js来解出变化数据)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS造轮子-数字金额每隔3位用逗号隔开
- 下一篇: kafka查看消费情况