1. 程式人生 > >英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

用Charles爬取資料

Windows用Fiddler也差不多。

Charles是一個多平臺的抓包工具,可以很方便的抓取http和https資料。

1.抓取資料

抓取資料前我們首先要清楚,由於有道詞典的翻譯使用的是post請求,所以我們要抓取的資訊有:url連結、request headers(請求頭)、format data(資料表單,也即請求體request body)

a)開啟Charles,選擇Proxy選項卡中的macOS Proxy選項。

 

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

 

b)開啟瀏覽器,輸入網址 http://fanyi.youdao.com

,然後在左邊的輸入框輸入要翻譯的內容。

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

c)開啟Charles,點選左邊的Structure選項卡,依次點選找到箭頭指示的內容,可以在右邊的Overview選項卡中看到基本的請求資訊,這裡我們需要的url連結就出現了。

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

d)點選右邊的content選項卡,再點選Raw選項卡,就可以看到原始的請求資料,紅框所示是請求頭資訊,藍框所示是請求體資訊。

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

2. 整理資料

a)將找到url連結、請求頭以及請求體資料複製到sublime編輯器中。

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

b)利用sublime的替換功能,將資料整理成我們寫程式時想要的python中字典的形式。

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

2

程式碼實現

閒話不多說,先貼程式碼

import urllib.parse 
import urllib.request 
 
def youdao(): 
 # 構建url連結 
 # url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' 
 # 這裡要去掉?號前面的_o,不然會進行加密演算法,導致失敗 
 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' 
 
 # 構建請求頭 
 headers = { 
 "User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' 
 } 
 words = input("請輸入要翻譯的內容:") 
 
 # 構建請求體 
 format_data = { 
 'i': words, 
 'from':'AUTO', 
 'to':'AUTO', 
 'smartresult':'dict', 
 'client':'fanyideskweb', 
 'salt':'1526368137702', 
 'sign':'f0cd13ef1919531ec9a66516ceb261a5', 
 'doctype':'json', 
 'version':'2.1', 
 'keyfrom':'fanyi.web', 
 'action':'FY_BY_REALTIME', 
 'typoResult':'false' 
 } 
 
 # 進行url編碼 
 format_data = urllib.parse.urlencode(format_data).encode("utf-8") 
 
 # 獲取request檔案(傳入了data引數,就是post請求) 
 request = urllib.request.Request(url, data = format_data, headers = headers) 
 
 # 開啟請求檔案 
 response = urllib.request.urlopen(request) 
 
 # 讀取檔案內容 
 content = response.read() 
 content = eval(content) 
 ret = content["translateResult"][0][0]['tgt'] 
 
 print(ret) 
 return ret 
 
if __name__ == "__main__": 
 youdao()

執行結果:

 

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

 

注意點:

1.如果使用原始的url進行爬取,會返回erro500的錯誤,我們需要將原始的請求url裡面的"_o"去掉,這樣伺服器就不會進行驗證。

2.程式碼對請求體進行了url編碼後,還進行了二進位制編碼,因為http請求用的是二進位制,所以要進行編碼,才能傳送post請求。

3.請求包體裡面的'i',是我們使用者輸入的翻譯內容,所以這是我們要自定義輸入的地方。

3

圖形介面

程式碼基本實現後,覺得有點無趣,就用python3自帶的tkinter寫了個小的圖形介面出來,程式碼如下:

from tkinter import * 
import urllib.parse 
import urllib.request 
 
 
def youdao(words): 
 # 構建url 
 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' 
 
 # 構建請求頭 
 headers = { 
 "User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' 
 } 
 
 # 構建請求體 
 format_data = { 
 'i': words, 
 'from':'AUTO', 
 'to':'AUTO', 
 'smartresult':'dict', 
 'client':'fanyideskweb', 
 'salt':'1526368137702', 
 'sign':'f0cd13ef1919531ec9a66516ceb261a5', 
 'doctype':'json', 
 'version':'2.1', 
 'keyfrom':'fanyi.web', 
 'action':'FY_BY_REALTIME', 
 'typoResult':'true' 
 } 
 
 # 進行url編碼 
 format_data = urllib.parse.urlencode(format_data).encode("utf-8") 
 
 # 獲取request檔案(傳入了data引數,就是post請求) 
 request = urllib.request.Request(url, data = format_data, headers = headers ) 
 
 # 開啟請求檔案 
 response = urllib.request.urlopen(request) 
 
 # 讀取檔案內容 
 content = response.read() 
 content = eval(content) 
 ret = content["translateResult"][0][0]['tgt'] 
 
 print(ret) 
 return ret 
 
 
# 主程式 
root = Tk() 
# 設定標題 
root.title("呆瓜詞典") 
# 設定主視窗大小 
root.geometry("320x150") 
# 可變大小 
root.resizable(width=False, height=True) 
 
 
# 第一排輸入框 輸入查詢的內容 
# 左邊是一個標籤 
l1 = Label(root, text = '查詢內容', bg = "yellow", font = (12), height = 1, width = 8) 
l1.place(x = 20,y = 20) 
var1 = StringVar() 
input_text = Entry(root, textvariable = var1) 
input_text.place(x = 100, y = 20) 
 
# 第二排顯示框 顯示查詢的結果 
# 左邊是一個標籤 
l2 = Label(root, text = '查詢結果', bg = "yellow", font = (12), height = 1, width = 8) 
l2.place(x = 20, y =60) 
var2 = StringVar() 
output_text = Entry(root, textvariable = var2) 
output_text.place(x = 100, y =60) 
 
# 呼叫youdao函式,傳進要翻譯的內容 
def func(): 
 words = var1.get() 
 if words: 
 # print(words) 
 result = youdao(words) 
 var2.set(result) 
 
# 新增一個按鈕 
b = Button(root, text = "查詢", command = func) 
b.place(x = 170, y = 100) 
 
# 執行主程式 
root.mainloop()

進群:960410445  即可獲取原始碼!

執行效果:

 

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

 

 

英語沒學好?不要緊!自己弄一個翻譯軟體就行了!Python打造!

 

 

中英文都可以翻譯,至此任務就完成了。