利用Python3和Charles爬取有道詞典


一.用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選項卡,就可以看到原始的請求數據,紅框所示是請求頭信息,藍框所示是請求體信息。

  1. 整理數據

a)將找到url鏈接、請求頭以及請求體數據復制到sublime編輯器中。

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

二.代碼實現

閑話不多說,先貼代碼

  1. import urllib.parse  
  2. import urllib.request  
  3.     
  4. def youdao():  
  5.     構建url鏈接  
  6.     # url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'  
  7.     這里要去掉?號前面的_o,不然會行加密算法,致失  
  8.     url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'  
  9.     
  10.     構建  
  11.     headers = {  
  12.         "User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0'  
  13.     }  
  14.     words = input("請輸入要翻譯的內容:")  
  15.     
  16.     構建求體  
  17.     format_data = {  
  18.         'i': words,  
  19.         'from':'AUTO',  
  20.         'to':'AUTO',  
  21.         'smartresult':'dict',  
  22.         'client':'fanyideskweb',  
  23.         'salt':'1526368137702',  
  24.         'sign':'f0cd13ef1919531ec9a66516ceb261a5',  
  25.         'doctype':'json',  
  26.         'version':'2.1',  
  27.         'keyfrom':'fanyi.web',  
  28.         'action':'FY_BY_REALTIME',  
  29.         'typoResult':'false'  
  30.     }  
  31.     
  32.     進行url編碼  
  33.     format_data = urllib.parse.urlencode(format_data).encode("utf-8")  
  34.     
  35.     獲取request文件(傳入了data參數,就是post請求)  
  36.     request = urllib.request.Request(url, data = format_data, headers = headers)  
  37.     
  38.     打開求文件  
  39.     response = urllib.request.urlopen(request)  
  40.     
  41.     讀取文件內容  
  42.     content = response.read()  
  43.     content = eval(content)  
  44.     ret = content["translateResult"][0][0]['tgt']  
  45.     
  46.     print(ret)  
  47.     return ret  
  48.     
  49. if __name__ == "__main__":  
  50.     youdao()  

運行結果:

注意點:

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

2.代碼第33行對請求體進行了url編碼后,還進行了二進制編碼,因為http請求用的是二進制,所以要進行編碼,才能發送post請求。

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

三.圖形界面

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

  1. from tkinter import *  
  2. import urllib.parse  
  3. import urllib.request  
  4.     
  5.     
  6. def youdao(words):  
  7.     構建url  
  8.     url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'  
  9.     
  10.     構建  
  11.     headers = {  
  12.         "User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0'  
  13.     }  
  14.     
  15.     構建求體  
  16.     format_data = {  
  17.         'i': words,  
  18.         'from':'AUTO',  
  19.         'to':'AUTO',  
  20.         'smartresult':'dict',  
  21.         'client':'fanyideskweb',  
  22.         'salt':'1526368137702',  
  23.         'sign':'f0cd13ef1919531ec9a66516ceb261a5',  
  24.         'doctype':'json',  
  25.         'version':'2.1',  
  26.         'keyfrom':'fanyi.web',  
  27.         'action':'FY_BY_REALTIME',  
  28.         'typoResult':'true'  
  29.     }  
  30.     
  31.     進行url編碼  
  32.     format_data = urllib.parse.urlencode(format_data).encode("utf-8")  
  33.     
  34.     獲取request文件(傳入了data參數,就是post請求)  
  35.     request = urllib.request.Request(url, data = format_data, headers = headers )  
  36.     
  37.     打開求文件  
  38.     response = urllib.request.urlopen(request)  
  39.     
  40.     讀取文件內容  
  41.     content = response.read()  
  42.     content = eval(content)  
  43.     ret = content["translateResult"][0][0]['tgt']  
  44.     
  45.     print(ret)  
  46.     return ret  
  47.     
  48.     
  49. 主程序  
  50. root = Tk()  
  51. 設置標題  
  52. root.title("呆瓜")  
  53. 設置主窗口大小  
  54. root.geometry("320x150")  
  55. 大小  
  56. root.resizable(width=False, height=True)  
  57.     
  58.     
  59. 第一排入框 輸入查詢的內容  
  60. 是一個標簽  
  61. l1 = Label(root, text = '查詢內容', bg = "yellow", font = (12), height = 1, width = 8)  
  62. l1.place(x = 20,y = 20)  
  63. var1 = StringVar()  
  64. input_text = Entry(root, textvariable = var1)  
  65. input_text.place(x = 100, y = 20)  
  66.     
  67. 第二排示框 顯示查詢的結果  
  68. 是一個標簽  
  69. l2 = Label(root, text = '查詢結果', bg = "yellow", font = (12), height = 1, width = 8)  
  70. l2.place(x = 20, y =60)  
  71. var2 = StringVar()  
  72. output_text = Entry(root, textvariable = var2)  
  73. output_text.place(x = 100, y =60)  
  74.     
  75. 調用youdao函數,傳進要翻的內容  
  76. def func():  
  77.     words = var1.get()  
  78.     if words:  
  79.         # print(words)  
  80.         result = youdao(words)  
  81.         var2.set(result)  
  82.     
  83. 添加一個按  
  84. b = Button(root, text = "查詢", command = func)  
  85. b.place(x = 170, y = 100)  
  86.     
  87. 運行主程序  
  88. root.mainloop()  

運行效果:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM