美文网首页Python新世界
英语没学好?不要紧!自己弄一个翻译软件就行了!Python打造!

英语没学好?不要紧!自己弄一个翻译软件就行了!Python打造!

作者: 919b0c54458f | 来源:发表于2018-12-22 10:22 被阅读6次

    用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链接就出现了。

    进群:960410445  即可获取源码哦!

    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,

    '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)

    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 = '查询结果', 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函数,传进要翻译的内容

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

    运行效果:

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

    相关文章

      网友评论

        本文标题:英语没学好?不要紧!自己弄一个翻译软件就行了!Python打造!

        本文链接:https://www.haomeiwen.com/subject/wvqikqtx.html