美文网首页我的 一 延展性
利用Python3和Charles爬取有道词典,生成翻译exe单

利用Python3和Charles爬取有道词典,生成翻译exe单

作者: 砾桫_Yvan | 来源:发表于2018-07-26 18:14 被阅读2次

    感觉挺好玩的,所以就转了,但我也做了定制化。

    原文:

    https://www.cnblogs.com/daigua/p/9055736.html

    一.用Charles爬取数据(Windows用Fiddler也差不多)

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

    1.抓取数据

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

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

    macOS Proxy

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

    有道

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

    Charles

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

    请求数据
    1. 整理数据

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

    整理前

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

    整理后

    二.代码实现

    闲话不多说,先贴代码

    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',是我们用户输入的翻译内容,所以这是我们要自定义输入的地方。

    三.图形界面

    代码基本实现后,觉得有点无趣,就用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()  
    

    运行效果:

    示例1 示例2

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

    撒花

    ---------------------------------我是华丽丽的分割线---------------------------------

    我也跟着博主实践了,挺好玩,还写成了图形界面的,但是我觉得布局可以再优化一点点,还可以在打包成exe单文件。

    步骤:

    1. 先调整布局

    我修改后的代码:

    # -*- coding: utf-8 -*-
    # Created by yawa1hz1 on 2018/6/12 15:17.
    import urllib.parse
    import urllib.request
    from tkinter import *
    
    
    def youdao(words):
        # 构建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': '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("300x120")
    # 可变大小
    root.resizable(width=False, height=False)
    
    # 第一排输入框 输入查询的内容
    # 左边是一个标签
    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)
    
    # 作者
    l1 = Label(root, text='By 呆瓜and杨', font=(6), height=1, width=12)
    l1.place(x=190, y=90)
    
    
    # 调用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=250, y=15)
    
    # 运行主程序
    root.mainloop()
    

    偷笑,我在作者那加了自己名字,皮了一下。运行生成tkinter程序后,如下图,

    调整后
    1. 打包生成exe单文件

    利用Pyinstaller的命令行生成exe单文件,Pyinstaller是Python的第三方库,可以用pip来安装,或者利用PyCharm的Project Interpreter来安装。

    打包生成exe

    下图是我把Pyinstaller命令配置到PyCharm里的第三方工具里的操作界面

    Pyinstaller

    对于Pyinstaller命令的使用说明可以去网上搜搜。注意生成exe过程中会产生很多构建文件。

    最后,看成果吧,我又皮了一下,加了图标,哈哈。

    exe 快捷键

    查询单词别提多方便,好了,就这样吧,大家可以自己生成一个exe玩玩。

    相关文章

      网友评论

        本文标题:利用Python3和Charles爬取有道词典,生成翻译exe单

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