Python爬蟲2-翻譯小程式
1、簡介
本次部落格分享的內容為基於有道線上翻譯實現一個實時翻譯小程式,本次任務是參考小甲魚的書《零基礎入門學習Python》完成的,書中程式碼對於當前的有道詞典並不適用,使用後無法實現翻譯功能,在網上進行學習之後解決了這一問題。
2、前置工作
1)由於有道線上翻譯是“反爬蟲”的,所以在編寫該程式的時候需要使用到User-Agent,通過使用request模組中的headers引數,對它進行適當的設定就可以將程式訪問偽裝為瀏覽器訪問,有兩種方法可以新增headers引數,我使用的方法是通過add_header()方法往Request物件中新增headers引數;
2)我使用的是360瀏覽器,獲取它User-Agent的方法是在位址列中輸入about:version即可,結果如下圖:
3)在獲得該引數後還需要獲取有道翻譯的data資料,首先先開啟有道翻譯介面,然後開啟其審查元素,點選netwoek,然後在翻譯框內輸入word點選翻譯,找到如下圖所示的位置:
4)一直往下滑動,就可以找到data引數,在程式設計時的設定就需要按照這裡來完成,如下圖:
其中在headers中需要設定的Referer及User-Agent也在上圖中可以找到。
3、任務程式碼
在程式的編寫中需要使用到許多python模組,包括urllib、json 、time等等。
對於urllib在上一篇部落格中已經用到了,它的作用是一個高階的 web 交流庫,其核心功能就是模仿web瀏覽器等客戶端,去請求相應的資源,並返回一個類檔案物件。
json是一種輕量級的資料交換格式,易於人閱讀和編寫,我們需要使用json.loads 解碼 json資料。
time是用於獲取當前時間戳並延遲提交資料,延遲提交資料雖然會降低工作效率,但是也降低了ip被網頁拉黑的風險。
具體的程式碼如下圖所示:
import urllib.request #匯入urllib.request庫
import urllib.parse #匯入urllib.parse庫
import json #匯入json庫
import time #匯入time庫
import random #匯入random庫
import hashlib #匯入hashlib庫
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" #有道翻譯的網址
while True: #定義死迴圈
fanyi = input("請輸入想要翻譯的內容:") #使用者輸入想要翻譯的內容
#設定API介面
a = 'fanyideskweb' #設定client
b = fanyi #需要翻譯的內容
c = str(int(time.time() * 1000)+ random.randint(1, 10)) #當前時間戳
d = 'rY0D^0\'nM0}g5Mm1z%1G4' #加密字元
sign = hashlib.md5((a +b +c + d).encode('utf - 8')).hexdigest() #根據內容進行md5加密
#設定data,按照網頁審查元素設定即可
data = {}
data['i'] = fanyi
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = c
data['sign'] = sign
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyform'] = 'fanyi.web'
data['action'] = 'FY_BY_CLICKBUTTION'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf - 8') #urlencode轉換data資料並編碼為utf-8碼
req = urllib.request.Request(url, data) #指定網頁,包含url、data和head
#偽造瀏覽器訪問
req.add_header('Referer','http://fanyi.youdao.com')
req.add_header('User - Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE')
response = urllib.request.urlopen(req) #post方式開啟指定網頁
html = response.read() #讀取網頁資訊
html = html.decode('utf - 8') #將utf-8碼解碼為unicode碼
target = json.loads(html) #把json頁面轉換為一個字典
print("翻譯結果: %s" % (target['translateResult'][0][0]['tgt'])) #輸出
time.sleep(5) #延遲提交資料
執行結果如下圖所示:
4、總結
書上的知識是否正確還需要自己敲一邊程式碼才能進行驗證,所以說動手才是最重要的,本次製作這個翻譯小程式,由於書本知識的錯誤,我通過網上查詢資料才解決了這個問題,從中也學到了許多知識,希望自己能繼續加油,學到更多的知識。