破解有道翻譯反爬蟲機制

破解有道翻譯反爬蟲機制

web端的有道翻譯,在之前是直接可以爬的。也就是說只要獲取到了他的接口,你就可以肆無忌憚的使用他的接口進行翻譯而不需要支付任何費用。那么自從有道翻譯推出他的API服務的時候,就對這個接口做一個反爬蟲機制(如果大家都能免費使用到他的翻譯接口,那他的API服務怎么賺錢)。這個反爬蟲機制在爬蟲領域算是一個非常經典的技術手段。那么他的反爬蟲機制原理是什么?如何破解?接下來帶大家一探究竟。

一、正常的爬蟲流程:

如果你要爬取他的翻譯接口,這個流程還是不能少的。首先我們打開有道翻譯的鏈接:http://fanyi.youdao.com/。然后在頁面中右鍵->檢查->Network項。這時候就來到了網絡監聽窗口,以后你在這個頁面中發送的所有網絡請求,都會在Network這個地方顯示出來。接著我們在翻譯的窗口輸入我們需要翻譯的文字,比如輸入hello。然后點擊自動翻譯按鈕,那么接下來在下面就可以看到瀏覽器給有道發送的請求,這里截個圖看看:

01.png

在上圖,我們可以看到發送了很多的網絡請求,這里我們點擊第一個網絡請求進行查看:


02.png

可以看到,我們在點擊自動翻譯的時候,發送的請求就是上圖中Request URL的那個URL,然后我們再點擊那個Response,我們可以看到返回的結果:

03.png

并且,現在我們再回到Headers的地方,然后滾動到最下面,可以看到有一個Form Data的地方,這個下面展示了許多的數據,這些數據就是你在點擊翻譯的時候瀏覽器給服務器發送的數據:

04.png

對其中幾個比較重要的數據進行解釋:

  • i:需要進行翻譯的字符串,這個地方我們輸入的是hello。
  • salt:加密用到的鹽。這個是我們破解有道反爬蟲機制的關鍵點,后面會講到。
  • sign:簽名字符串。也是破解反爬蟲機制的關鍵點。

其他的數據類型暫時就不怎么重要了,都是固定寫法,我們后面寫代碼的時候直接鞋子就可以了。到現在為止,我們就可以寫一個簡單的爬蟲,去調用有道翻譯的接口了。這里我們使用的網絡請求庫是Python3自帶的urllib,相關代碼如下:

# 導入需要的庫
import urllib.request
import urllib.parse
import json

# 等待用戶輸入需要翻譯的單詞
content = input('請輸入需要翻譯的單詞:')

# 有道翻譯的url鏈接
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=null'

# 發送給有道服務器的數據
data = {}

# 需要翻譯的文字
data['i'] = content
# 下面這些都先按照我們之前抓包獲取到的數據
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = '1500349255670'
data['sign'] = '997742c66698b25b43a3a5030e1c2ff2'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_CL1CKBUTTON'
data['typoResult'] = 'true'

# 對數據進行編碼處理
data = urllib.parse.urlencode(data).encode('utf-8')

# 創建一個Request對象,把url和data傳進去,并且需要注意的使用的是POST請求
request = urllib.request.Request(url=self.url, data=data, method='POST')
# 打開這個請求
response = urllib.request.urlopen(request)
# 讀取返回來的數據
result_str = response.read().decode('utf-8')
# 把返回來的json字符串解析成字典
result_dict = json.loads(result_str)

# 獲取翻譯結果
print('翻譯的結果是:%s' % result_dict)

我們運行這個文件后,當我們輸入的是hello的時候,我們可以得到哈羅的這個正確的翻譯結果。而當我們輸入其他需要翻譯的字符串的時候,比如輸入i love you,那么就會得到一個錯誤代碼{"errorCode":50}。這就奇怪了,有道詞典不可能只能翻譯一個英文單詞吧。而這個,就是有道詞典的反爬蟲機制。接下來我們就來破解有道詞典的反爬蟲機制。

二、破解反爬蟲機制:

我們可以多次的進行翻譯,并且每次翻譯后都去查看翻譯的時候發送的這個網絡請求,比較每次翻譯時候發送的Form Data的值。我們注意到,Form Data在每次發送網絡請求的時候,只有isalt以及sign這三個是不同的,其他的數據都是一樣的,這里我用helloworld兩個單詞翻譯時候Form Data的數據進行比較:

05.png

06.png

圖中的Form Data也證實了我剛剛所說的,就是除了isalt以及sign是不一樣的。其余都是一樣的。而i不一樣是很正常的。因為i代表的是要翻譯的字符串,這個不同是很正常。而saltsign這兩個東西不一樣,是怎么產生的呢?這里我們可以分析一下,這兩個值在每次請求的時候都不一樣,只有兩種情況:第一是每次翻譯的時候,瀏覽器會從有道服務器獲取一下這兩個值。這樣可以達到每次翻譯的時候值不同的需求。第二是在本地,用JS代碼按照一定的規則生成的。那么我們首先來看第一個情況,我們可以看到在每次發送翻譯請求的時候,并沒有一個請求是專門用來獲取這兩個值的:

07.png

所以就可以排除第一種情況。就只剩下一種可能,那就是在本地自己生成的,如果是在本地自己生成的,那么規則是什么呢?這里我們點擊網頁,查看網頁源代碼,查找所有的JS文件,我們找到那個fanyi.js

08.png

然后點擊這個文件,跳轉到這個源文件中,然后全選所有的代碼,復制下來,再打開站長工具:http://tool.chinaz.com/Tools/jsformat.aspx。把代碼復制進去后,點擊格式化:

09.png

然后把格式化后的代碼,復制下來,用sublime或者pycharm打開都可以,然后搜索salt,可以找到相關的代碼:

10.png

這里我們就可以發現所有的值的生成原理了。這里來做個簡介:

  • d:代表的是需要翻譯的字符串。
  • f:當前時間的時間戳加上0-10的隨機字符串。
  • u:一個常量——fanyideskweb
  • c:一個常量——rY0D^0'nM0}g5Mm1z%1G4
  • salt:就是f變量,時間戳。
  • sign:使用的是u + d + f + cmd5的值。

知道saltsign的生成原理后,我們就可以寫Python代碼,來對接他的接口了,以下是相關代碼:

import urllib.request

import urllib.parse
import json
import time
import random
import hashlib

content = input('請輸入需要翻譯的句子:')

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=https://www.google.com/'

data = {}

u = 'fanyideskweb'
d = content
f = str(int(time.time()*1000) + random.randint(1,10))
c = 'rY0D^0\'nM0}g5Mm1z%1G4'

sign = hashlib.md5((u + d + f + c).encode('utf-8')).hexdigest()

data['i'] = content
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = f
data['sign'] = sign
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_CL1CKBUTTON'
data['typoResult'] = 'true'

data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url,data=data,method='POST')
response = urllib.request.urlopen(request)

print(response.read().decode('utf-8'))

寫在最后:

像以上這種,通過用JS在本地生成隨機字符串的反爬蟲機制,在爬蟲的時候是經常會遇到的一個問題。希望通過以上的講解,能為大家提供一種思路。以后再碰到這種問題的時候知道該如何解決。這樣本篇文章的目的也就達到了。另外,如果想精通爬蟲技術,建議學習下這個課程,相信你學習完后有很大的成長:21天搞定Python分布式爬蟲

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容