一.用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中字典的形式。
二.代码实现
闲话不多说,先贴代码
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. '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. # 构建请求体
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. "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. "translateResult"][0][0]['tgt']
45.
46. print(ret)
47. return ret
48.
49. if"__main__":
50. youdao()
运行结果:
注意点:
1.如果使用原始的url进行爬取,会返回erro500的错误,我们需要将原始的请求url里面的"_o"去掉,这样服务器就不会进行验证。
2.代码第33行对请求体进行了url编码后,还进行了二进制编码,因为http请求用的是二进制,所以要进行编码,才能发送post请求。
3.请求包体里面的'i',是我们用户输入的翻译内容,所以这是我们要自定义输入的地方。
三.图形界面
代码基本实现后,觉得有点无趣,就用python3自带的tkinter写了个小的图形界面出来,代码如下:
1. fromimport *
2. import urllib.parse
3. import urllib.request
4.
5.
6. def youdao(words):
7. # 构建url
8. '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. "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. "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()
运行效果:
中英文都可以翻译,至此任务就完成了。