利用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()  

运行效果:

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

猜你喜欢

转载自www.cnblogs.com/daigua/p/9055736.html
今日推荐