用Charles爬取数据
Windows用Fiddler也差不多。
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选项卡,就可以看到原始的请求数据,红框所示是请求头信息,蓝框所示是请求体信息。

2. 整理数据
a)将找到url链接、请求头以及请求体数据复制到sublime编辑器中。

b)利用sublime的替换功能,将数据整理成我们写程序时想要的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()
运行结果:

注意点:
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,'typoResult':'true'
}
进行url编码
format_data = urllib.parse.urlencode(format_data).encode("utf-8")
获取request文件(传入了data参数,就是post请求)
request = urllib.request.Request(url,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 = '查询结果',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? 即可获取源码!
运行效果:


中英文都可以翻译,至此任务就完成了。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|