王崇剛



摘要:利用Python爬取網頁數據通常使用Python的urllib庫及第三方requests庫實現,本文闡述了如何利Python的第三方requests庫向有道翻譯在線翻譯網站發送POST請求,并對有道翻譯網站的加密過程進行了分析,最后將網站反饋的翻譯結果進行處理,從而實現基于Python在線翻譯爬蟲。
關鍵詞:? Requests ;Python;網絡爬蟲;在線翻譯
中圖分類號:TP311? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2019)28-0219-03
Abstract:? Usually use Python crawl web data using the Python urllib library and the realization of the third party requests the library, this paper expounds how the third party requests of Python library send a POST request to the translation youdao online translation website, and the encryption process of youdao translation site was analyzed, and finally translated website feedback result, which is based on the Python online translation the crawler.
Key words: Requests;Python;Web crawler;Online translation
有道翻譯網站采用HTTP協議實現客戶端瀏覽器與翻譯網站通信,利用Python編寫爬蟲程序偽裝成為瀏覽器與在線翻譯網站通信,從而實現在線翻譯爬蟲。Python通常使用urllib庫、requests庫實現爬取網站數據,而requests庫提供了更高級的封裝、使用更為簡潔、更容易理解等優勢,從而獲得了更為廣泛的使用。本文將使用requests庫中的方法實現在線翻譯爬蟲。
1 在線翻譯爬蟲的實現準備
1.1 分析在線翻譯網站前的準備
打開瀏覽器在瀏覽器地址欄中輸入有道翻譯網站地址(http://fanyi.youdao.com/),同時打開Fiddler軟件捕獲通信數據包,在有道翻譯網站的對話框中輸入需要翻譯的文字“貴州省貴陽市觀山湖區”,通過翻譯可以得到翻譯后的英文“Guanshanhu district, guiyang city, guizhou province”,該翻譯結果作為后期爬蟲的驗證使用。
1.2 分析請求方式
通過Fiddler軟件分析瀏覽器與有道翻譯網站通信數據包,分析瀏覽器與翻譯網站通信中HTTP協議及參數含義,通過Fiddler軟件抓取數據包分析(如圖 1所示),有道翻譯網站均采用HTTP協議中的POST方法將需要翻譯的文本提交給服務器處理。
1.2 與有道翻譯網站通信POST請求參數的分析
通過圖 2可以得到有道翻譯網站POST請求中的參數,參數“i”標識需要翻譯的文本,參數“i”的值為“貴州省貴陽市觀山湖區”;參數“from”表示翻譯前的文本語言,默認值為自動檢測翻譯前的文本語言;參數“to”表示需要翻譯的目標語言,默認值為auto語言(默認翻譯是中英、英中的翻譯);參數“salt”表示時間戳用于加密時使用;參數“sign”表示加密驗證字段,該加密驗證字段根據需要翻譯文本和時間戳進行加密,所以每次請求不一致。
1.4 有道翻譯網站返回翻譯結果分析
通過Fiddler軟件分析,有道翻譯網站返回的翻譯結果均采用JSON格式,JSON是一種簡單的數據交換格式,其優點是數據格式簡單,易于讀寫,占用帶寬小;易于解析,支持多種語言。
通過圖 3分析得出,有道翻譯網站返回結果在translateResult對象中,在translateResult對象中“src”為翻譯前文本的key,其key對應的value為貴州省貴陽市觀山湖區,“tgt”為翻譯后文本的key,其key對應的value為Guanshanhu district, guiyang city, guizhou province。
2在線翻譯網站加密驗證分析
通過Fiddler軟件對有道翻譯網站HTTP協議分析,有道翻譯網站為了防止網絡爬蟲采用了加密驗證,通過分析有道翻譯網站上的fanyi.min.js文件,有道翻譯網站加密驗證首先需要生成一個13位salt時間戳,該時間戳不僅是POST請求中的salt的值還是計算sign中的主要參數之一。其次,通過MD5消息摘要算法生成一個128位的散列值,消息摘要算法中須要包含“fanyideskweb”、翻譯的文本、有道翻譯網站的加密字符串(該加密字符串每隔一段時間會發生變化,具體加密字符串見fanyi.min.js文件中的sign加密算法)等參數,通過MD5計算后的散列值就是POST請求中的sign值。具體加密驗證流程見圖4所示。
時間戳參數算法中的參數說明:time.time()獲取當前時間的時間戳,因Python返回的時間戳是只有10位整數的浮點數,為獲取13位時間戳,將時間戳乘以1000以獲取13位時間戳值;random.randint(0, 10)是隨機獲取10以內的正整數,最后將13位時間戳值加上10以內的正整數結果取整數部分得到時間戳參數salt的值。
sign方法中的參數說明:get_md5()是Python的MD5的方法,fanyideskweb參數指的是客戶端類型為網頁,key參數表示需要翻譯的文本,str(salt)參數表示將13位整數時間戳轉換為字符串,加密字符串每隔一段時間回發生變化,該字符串可在fanyi.min.js文件中中進行通過搜索關鍵字“sign:n.md5”,查找到如sign:n.md5 (“fanyideskweb”+e+i+”加密字符串”)字樣獲取加密字符串,也可以通過爬蟲查找加密字符串。
Fanyi.min.js 地址如下:http://shared.ydstatic.com/fanyi/newweb/v1.0.18/scripts/newweb/fanyi.min.js
3 在線翻譯爬蟲的實現
通過分析了在線翻譯網站的請求方法、參數含義、返回結果、加密驗證后,在線翻譯爬蟲可以依據圖 5的流程來實現。
3.1 構建HTTP請求Header,偽裝瀏覽器
構建http的請求頭部目的在于偽裝成為瀏覽器與翻譯網站進行通信,構造方法如下:
Httpheaders = {“User-Agent”: “Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0”, “Referer”: “http://fanyi.youdao.com/”},這里以構造火狐瀏覽器的請求頭部為例,請求的網址是:http://fanyi.youdao.com/
3.2 構建Post請求中data參數
Post請求參數中需要包含需要翻譯的文字、salt、sign等主要參數,salt、sign的方法見本文的第三部分,需要構建的參數如圖 2所示。構建Post請求中data參數的方法如下:
WebForms = {“i”: src_word,”from”: “AUTO”, “to”: “AUTO”, “smartresult”: “dict”,? ? ? ? “client”: “fanyideskweb”,”salt”: salt,”sign”: sign,”doctype”: “json”,”version”: “2.1”,? ? ? “keyfrom”: “fanyi.web”,”action”: “FY_BY_REALTIME”,”typoResult”: “false”}
retrun WebForms
3.3 向在線翻譯網站發送POST請求
在構造完POST的data后,利用requests庫中的post方法向有道翻譯網站發送post請求,其中cookies為http請求中產生的cookies。
Response = requests.post(url, headers=Httpheaders, data=WebForms, cookies=cookies)
3.4 獲取返回的json數據
從響應中獲取json參數,通過處理提取翻譯結果并打印,具體代碼如下:
json_str = response.json()? #從響應中獲取json字符串
json_str = re.sub(‘\, ‘\”, str(json_str))? # 將單引號變為雙引號
jsonObj=json.loads(json_str)? #將已編碼的 JSON 字符串解碼為 Python 對象
tgt_dic=jsonObj[‘translateResult][0][0][‘tgt]? #提取 JSON中的翻譯結果
print(“翻譯結果:”+tgt_dic)? #打印翻譯結果
4 在線翻譯爬蟲的結果分析
通過有道翻譯網站(如圖 6所示)與基于Python在線翻譯爬蟲程序(如圖 7所示)對“貴州省貴陽市觀山湖區”和“Guanshanhu district, guiyang city, guizhou province”兩句話翻譯的結果進行對比分析,翻譯結果一致,說明基于Python在線翻譯爬蟲已經實現。
參考文獻:
[1]夏天琦.Python爬蟲獲取網絡圖片[J].電子世界,2018(10).
[2]韓前進.Web在線爬蟲的設計與實現[J].軟件,2018(9).
[3]劉榮欣.基于Apache HttpClient的在線翻譯代理系統的設計與實現[D].東北大學,2014.
[4]郭麗蓉. 基于Python的網絡爬蟲程序設計[J].電子技術與軟件工程,2017(23)
[5]施俊龍.動態口令S/KEY認證協議的改進與應用[D].合肥工業大學,2010.
[6]網易公司. 有道翻譯API[OL].? http://fanyi.youdao.com/openapi.
【通聯編輯:唐一東】