有道詞典翻譯(攜帶請求頭和post參數請求)


 一、靜態爬取頁面信息

有道翻譯網址:http://fanyi.youdao.com/

在翻譯中輸入python

找到接口和請求的方式

參數是From Data類型

需要把參數數據轉換為字典,

復制粘貼后按住Ctrl + r ,然后

Headers

內容的長度是data攜帶參數的長度

代碼實現

 

分析:紅色圈住的,是會根據要翻譯的內容變化而變化

運行結果:

 

代碼:

import requests
import json

# 定義爬取url地址
base_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

# 定義請求參數
data = {
    'i': 'python',
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15508011658043',
    'sign': '8f6d849c13cec811c6b7ab6d0ad41eb6',
    'ts': '1550801165804',
    'bv': '6f014bd66917f921835d1d6ae8073eb1',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTIME',
    'typoResult': 'false'
}

# 定義請求頭部參數
headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Length': '256',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-1632754728@10.169.0.84; JSESSIONID=aaavabYot4NQ1fAZH8sKw; '
              'OUTFOX_SEARCH_USER_ID_NCOO=933374763.1142684; ___rl__test__cookies=1550801165800',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/71.0.3578.98 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}

# 發起請求 加入headers參數,讓服務器知道是瀏覽器訪問的
response = requests.post(base_url, data=data, headers=headers)
json_data = response.json()
print(json_data)
View Code

 

二、動態爬取頁面信息(加密)

輸入測試數據,再通過使用F12觀察,其中有一條是POST請求,而向服務器發送的請求數據並不是在url里,那么我們可以試着模擬這個POST請求。

1、data字典內容:

2、headers字典內容:

3、運行結果:根據不同的單詞,返回的數據不一樣

4、解決問題:

data中的參數中,我們看到”salt“和"sign"兩個,這是添加數字簽名的標記。也就是這兩個參數的值是生成出來的,也就是說隨着翻譯內容的不同,這兩個值可能是會變化的。

像這種動態生成的值一般會寫在js腳本文件中。

(1)查找對應的js文件

(2)查看文件

雙擊復制Response中的內容,打開在線格式網頁,如下圖所示:

為了方便查看,我們在新建一個js文件,並且搜索與”salt“相關的字符,如下圖所示:

分析:i在這里是什么?

(3)生產salt內容

其中

這行語句我們可以在瀏覽器中的控制台上輸出看一下,如下圖

可見是精化到毫秒(1毫秒=0.001秒)的時間戳,(用同樣的方式驗證:parseInt(10 * Math.random(), 10)),我們可以在python輸出一個時間,兩者做個對比

保留三位小數,然后把它轉換為整形

所以這個在JS中生成的salt值

python中可以這樣生成:

(4)生成sign內容

推導出:sign = i.sign

  1. sign = n.md5("fanyideskweb" + e + i + "p09@Bn{h02_BIEe]$P^nG")

e = e.i     e.i = 需要翻譯的關鍵字

i = r + parseInt(10 * Math.random(), 10)

r = "" + (new Date).getTime()

 

編寫程序:

 

編程當中需要注意的地方:

發送post請求時,需要特別注意headers的一些屬性:

  Content-Length: 144: 是指發送的表單數據長度為144,也就是字符個數是144個。

  X-Requested-With: XMLHttpRequest :表示Ajax異步請求。

  Content-Type: application/x-www-form-urlencoded : 表示瀏覽器提交 Web 表單時使用,表單數據會按照 name1=value1&name2=value2 鍵值對形式進行編碼。

 

代碼如下:

import requests
import random
import time
import hashlib

# md5加密函數
def getmd5(value):
    # 生成MD5對象
    md5 = hashlib.md5()
    # 將值進行編碼 編碼成字符串
    md5.update(bytes(value, encoding="utf-8"))
    # 對字符串進行加密
    sign = md5.hexdigest()
    return sign


def fanyi(key):
    # 定義起始url
    base_url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

    # 生成salt和sign參數
    salt = int(time.time() * 1000) + random.randint(0, 10)
    sign_str = "fanyideskweb" + key + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
    sign = getmd5(sign_str)
    data = {
        'i': key,
        # 'from': 'AUTO',
        # 'to': 'AUTO',
        # 'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': salt,
        'sign': sign,
        # 'ts': '1550801165804',
        # 'bv': '6f014bd66917f921835d1d6ae8073eb1',
        # 'doctype': 'json',
        # 'version': '2.1',
        'keyfrom': 'fanyi.web',
        # 'action': 'FY_BY_REALTIME',
        # 'typoResult': 'false'
    }

    headers = {
        # 'Accept': 'application/json, text/javascript, */*; q=0.01',
        # 'Accept-Encoding': 'gzip, deflate',
        # 'Accept-Language': 'zh-CN,zh;q=0.9',
        # 'Connection': 'keep-alive',
        # 'Content-Length': '256',
        # 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': 'OUTFOX_SEARCH_USER_ID=-1632754728@10.169.0.84; JSESSIONID=aaavabYot4NQ1fAZH8sKw; OUTFOX_SEARCH_USER_ID_NCOO=933374763.1142684; ___rl__test__cookies=1550801165800',
        # 'Host': 'fanyi.youdao.com',
        # 'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        # 'X-Requested-With': 'XMLHttpRequest'
    }

    # 發起請求 加入headers參數,讓服務器知道是瀏覽器訪問的
    response = requests.post(base_url, data=data, headers=headers)
    json_data = response.json()
    print(json_data)


if __name__ == "__main__":
    key = input("請輸入需要翻譯的內容:")
    fanyi(key)
View Code

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM