1. 程式人生 > >使用python2爬取有道翻譯

使用python2爬取有道翻譯

驗證碼 傳輸 5.0 translate 技術 pri nec orm lib

爬蟲的核心思想:模擬瀏覽器正常訪問服務器,一般情況只要瀏覽器能訪問的,都可以爬,如果被反爬,則考慮反復測試添加Request Header數據,知道可以爬取為止。

反爬思路目前知道的有:User-Agent,Cookie,Referer,訪問速度,驗證碼,用戶登錄及前端js代碼驗證等。本例遇到js驗證 User-Agent Referer Cookie共計4種反爬機制。

關鍵部分是,參數headers和data的構造,headers要進行反復測試,data數據裏面的變量查找思路。

參考資料:

用Python破解有道翻譯反爬蟲機制 https://blog.csdn.net/nunchakushuang/article/details/75294947

python破解網易反爬蟲機制 https://blog.csdn.net/luosai19910103/article/details/79522067

一些反爬機制 https://blog.csdn.net/javakklam/article/details/79841901

有道翻譯頁面,左邊輸入要翻譯的字符串,右邊會自動輸出翻譯的結果,如下圖

技術分享圖片

經過多次輸入字符測試,發現頁面無刷新,猜測可能使用ajax,然後進行抓包分析,發現的確使用ajax傳輸數據

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

代碼如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib
import urllib2
import time
import hashlib


url = ‘http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule‘
keyword = raw_input(‘請輸入要翻譯的字符串: ‘)

# headers作用模擬瀏覽器
headers = {
# "Accept": "application/json, text/javascript, */*; q=0.01",
# "Connection": "keep-alive",
# "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "你的瀏覽器cookie值",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36",
# "X-Requested-With": "XMLHttpRequest",
}

salt = str(int(time.time()*1000))

m = hashlib.md5()
str = "fanyideskweb" + keyword + salt + "ebSeFb%=XZ%T[KZ)c(sy!"
m.update(str)
sign = m.hexdigest().encode(‘utf-8‘)
print(sign)

# data為post請求數據
data = {
    "i":keyword,
    "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"
}

# 對post上傳的數據進行urlencode編碼
data = urllib.urlencode(data)

# urllib 僅可以接受URL,不能創建 Request 類實例,也不能設置參數headers ,但可以對url進行編碼,而urllib2不能編碼,所以經常一起使用
# 而urllib2.urlopen(url)不能構造復雜的request,所以要使用urllib2.Request(url,data=data,headers=headers),2者都是有data參數時表示post提交數據,headers的值為模仿瀏覽器請求頭裏面的的數據,格式為字典,讓服務器接受的數據看起來像使用瀏覽器訪問。
request = urllib2.Request(url,data=data,headers=headers)
response = urllib2.urlopen(request)
print(response.read())

代碼測試,如下圖

技術分享圖片

使用python2爬取有道翻譯