日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫模拟对“有道在线翻译”发送请求(请求中的数据含需分析js来解出变化数据)

發布時間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫模拟对“有道在线翻译”发送请求(请求中的数据含需分析js来解出变化数据) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每日分享:

做好自己

世界上沒有一份工作不辛苦,也沒有一處人事不復雜,無論你當下正在經歷什么,都要調整好心態,繼續前行,繼續努力!

總有人嫌你不夠好,也總有人覺得你哪里都好,愛你的人自然會愛你,不愛你的人做再多也是錯。

在長大、在失去、在努力、在接受、在好好生活。

不會js也可以解出來!!!

  • 分析構建data數據
  • 編寫代碼

一、分析js構建data數據(主要講解)

1. 在隱身窗口或無痕模式登錄有道在線翻譯:在線翻譯_有道

2. 抓包 -> 輸入要翻譯的句子

3. 再新建一個隱身窗口執行步驟2,找到translate包,觀察兩次的Form Data有什么不同:

?可以看到,表單中的 salt、sign、lts 這三個數據是變化的

4. 找到對應的js文件:

可以看到,js文件是同一個文件(后面的數字代表位置是在多少行) ,隨意打開一個就行

5. 找一個Form Data中比較特殊的詞,例如:smartresult(不要找像第一個數據 i ,因為 i 很可能會在js代碼中出現很多次),之后直接在js代碼中查找(Ctrl+f),找到如下代碼:

很明顯可以看出,它就是js中構建Form Data的部分代碼,我們可以根據它來分析?salt、sign、lts 這三個數據是如何得到的

6. 觀察這三個數據,可以發現,它們都與 r 有關:

?7. 之后就找 r 是什么,往上滑可以看到如下代碼:

所以,r 肯定與generateSaltSign這個函數有關

8. 通過查找(Ctrl+f)generateSaltSign這個關鍵詞,可以找到generateSaltSign函數是怎么來的(其他的地方都是調用這個函數):

?9. 我們可以發現,這行代碼是把 r 的值給了generateSaltSign函數,那么說明,在這個大括號里(這一塊代碼)肯定有 r 的值,因此就在大括號中找 r 即可:

可以看出,劃線代碼就是 r 的定義

10.? 可以在 r 的定義中找到?salt、sign、lts 這三個變化參數的來源:

lts:其實lts就是代碼中的ts:

?看lts的值:1638699280543,看到這一串數字要想到“時間戳”(也就是時間)

ts的值是 r 的值,而 r = "" + (new Date).getTime(),沒學過js看不懂也沒關系,我們可以復制這個語句:(new Date).getTime(),在如下圖輸入js代碼:

?如上就是得到的結果,可以推斷出,這行代碼的作用就是獲得時間戳;ts就是把時間戳變成了字符串類型,ts與lts數字的個數也一致,可以推斷它們是一樣的。

salt:細心的小伙伴可以發現,salt比lts就多了一位數字

salt的值就是 i 而 i =?r + parseInt(10 * Math.random(), 10);其中r是時間戳,后面代碼又看不懂了,繼續在Console中多次輸入parseInt(10 * Math.random(), 10):

多次輸入后你會發現,它是產生一個0-9的int型數據(沒有10),也就是說salt的值就是lts的值后面加上了一個隨機數

sign:首先可以看出它是十六進制

sign =?n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")

先說一下該表達式中的e:

我們可以想一下,什么東西這么重要,使js代碼中特別多的參數都是e,當然就是要翻譯的詞/句子了。

解析sign就需要我們知道python了,python中的hashlib模塊中有md5方法

這兩個是最常見的方法

下面通過代碼,來了解md5:

import hashlib # 進行hash運算的數據 data = 'python' # 創建hash對象 md5 = hashlib.md5() # 向hash對象中添加需要做hash運算的字符串 md5.update(data.encode()) # 獲取字符串的hash值(十六進制輸出) result = md5.hexdigest() print(result)

?結果:

在數據不是特別特別特別......大的時候,一個data對應一個md5后的值,一般不會出現重復

到此為止,Form Data 里面的值就都解決了,接下來寫代碼即可

二、源碼

import requests import hashlib import time import random import json from jsonpath import jsonpath # 編寫代碼步驟: # url # headers # form_data # 發送請求,獲取響應 # 解析數據(Response為json數據)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# 獲取數據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()# 構建表單數據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()# 得到的數據為json類型data = self.get_data()# 將json轉化為字典data = json.loads(data)data = jsonpath(data, '$..tgt')[0]print(data)if __name__ == '__main__':Word = input('輸入要翻譯的單詞或句子:')you_dao = You_dao(Word)you_dao.run()

總結

以上是生活随笔為你收集整理的爬虫模拟对“有道在线翻译”发送请求(请求中的数据含需分析js来解出变化数据)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。