zoukankan      html  css  js  c++  java
  • 利用Python3和Charles爬取有道词典

    一.用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选项卡,就可以看到原始的请求数据,红框所示是请求头信息,蓝框所示是请求体信息。

    1. 整理数据

    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.     url = '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.     words = input("请输入要翻译的内容:")  
    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.     format_data = urllib.parse.urlencode(format_data).encode("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.     ret = content["translateResult"][0][0]['tgt']  
    45.     
    46.     print(ret)  
    47.     return ret  
    48.     
    49. if __name__ == "__main__":  
    50.     youdao()  

    运行结果:

    注意点:

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

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

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

    三.图形界面

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

    1. from tkinter import *  
    2. import urllib.parse  
    3. import urllib.request  
    4.     
    5.     
    6. def youdao(words):  
    7.     构建url  
    8.     url = '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.     format_data = urllib.parse.urlencode(format_data).encode("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.     ret = content["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()  

    运行效果:

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

  • 相关阅读:
    循环神经网络(LSTM和GRU)(1)
    threading包的例子和queue包的例子
    xgboost调参
    理解 Python 中的 *args 和 **kwargs
    TFRecords文件的生成和读取(1)
    tensorflow函数介绍(4)
    python其他篇(1)
    python实现Restful服务(基于flask)(2)
    开源多线程性能测试工具-sysbench
    MySQL 8.0.0 版本发布,亮点都在这了!
  • 原文地址:https://www.cnblogs.com/daigua/p/9055736.html
Copyright © 2011-2022 走看看