一.用Charles爬取數據
Charles是一個多平台的抓包工具,可以很方便的抓取http和https數據。
1.抓取數據
抓取數據前我們首先要清楚,由於有道詞典的翻譯使用的是post請求,所以我們要抓取的信息有:url鏈接、request headers(請求頭)、format data(數據表單,也即請求體request body)
a)打開Charles,選擇Proxy選項卡中的macOS Proxy選項。
b)打開瀏覽器,輸入網址 http://fanyi.youdao.com,然后在左邊的輸入框輸入要翻譯的內容。
c)打開Charles,點擊左邊的Structure選項卡,依次點擊找到箭頭指示的內容,可以在右邊的Overview選項卡中看到基本的請求信息,這里我們需要的url鏈接就出現了。
d)點擊右邊的content選項卡,再點擊Raw選項卡,就可以看到原始的請求數據,紅框所示是請求頭信息,藍框所示是請求體信息。
- 整理數據
a)將找到url鏈接、請求頭以及請求體數據復制到sublime編輯器中。
b)利用sublime的替換功能,將數據整理成我們寫程序時想要的python中字典的形式。
二.代碼實現
閑話不多說,先貼代碼
-
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()
運行結果:
注意點:
1.如果使用原始的url進行爬取,會返回erro500的錯誤,我們需要將原始的請求url里面的"_o"去掉,這樣服務器就不會進行驗證。
2.代碼第33行對請求體進行了url編碼后,還進行了二進制編碼,因為http請求用的是二進制,所以要進行編碼,才能發送post請求。
3.請求包體里面的'i',是我們用戶輸入的翻譯內容,所以這是我們要自定義輸入的地方。
三.圖形界面
代碼基本實現后,覺得有點無趣,就用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()
運行效果:
中英文都可以翻譯,至此任務就完成了。