python有道词典-利用Python3和Charles爬取有道词典

一.用Charles爬取数据

Charles是一个多平台的抓包工具,可以很方便的抓取http和https数据。

1.抓取数据

抓取数据前我们首先要清楚,由于有道词典的翻译使用的是post请求,所以我们要抓取的信息有:url链接、request headers(请求头)、format data(数据表单,也即请求体request body)

a)打开Charles,选择Proxy选项卡中的macOS Proxy选项。

1402420-20180518131017642-1308062211.png

b)打开浏览器,输入网址 http://fanyi.youdao.com,然后在左边的输入框输入要翻译的内容。

1402420-20180518131022640-1415603440.png

c)打开Charles,点击左边的Structure选项卡,依次点击找到箭头指示的内容,可以在右边的Overview选项卡中看到基本的请求信息,这里我们需要的url链接就出现了。

1402420-20180518131027897-1025896771.png

d)点击右边的content选项卡,再点击Raw选项卡,就可以看到原始的请求数据,红框所示是请求头信息,蓝框所示是请求体信息。

1402420-20180518131034088-291311771.png

整理数据

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

1402420-20180518131038391-1153526544.png

b)利用sublime的替换功能,将数据整理成我们写程序时想要的python中字典的形式。

1402420-20180518131043458-569300057.png

二.代码实现

闲话不多说,先贴代码

importurllib.parse

importurllib.request

defyoudao():

#构建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)

returnret

if__name__ == "__main__":

youdao()

运行结果:

1402420-20180518131045528-713491622.png

注意点:

1.如果使用原始的url进行爬取,会返回erro500的错误,我们需要将原始的请求url里面的"_o"去掉,这样服务器就不会进行验证。

2.代码第33行对请求体进行了url编码后,还进行了二进制编码,因为http请求用的是二进制,所以要进行编码,才能发送post请求。

3.请求包体里面的'i',是我们用户输入的翻译内容,所以这是我们要自定义输入的地方。

三.图形界面

代码基本实现后,觉得有点无趣,就用python3自带的tkinter写了个小的图形界面出来,代码如下:

fromtkinter import*

importurllib.parse

importurllib.request

defyoudao(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)

returnret

#主程序

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函数,传进要翻译的内容

deffunc():

words = var1.get()

ifwords:

# print(words)

result = youdao(words)

var2.set(result)

#添加一个按钮

b = Button(root, text = "查询", command = func)

b.place(x = 170, y = 100)

#运行主程序

root.mainloop()

运行效果:

1402420-20180518131046441-1738394196.png

1402420-20180518131046713-1076121260.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值