zoukankan      html  css  js  c++  java
  • python3爬虫:利用urllib与有道翻译获得翻译结果

    在实现这一功能时遇到了一些困难,由于按照《零基础入门python》中的代码无法实现翻译,会爆出“您的请求来源非法,商业用途使用请关注有道翻译API官方网站“有道智云”: http://ai.youdao.com”这种神奇的错误。无奈百度,在一篇不错的博主上找到一个优化的代码,可以实现。分享一下链接https://blog.csdn.net/c406495762/article/details/59095864#comments

     1 from urllib import request
     2 from urllib import parse
     3 import json
     4 
     5 if __name__ == "__main__":
     6     # 对应上图的Request URL
     7     request_url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
     8     # 创建Form Data字典,存储上图中的Form Data
     9     Form_Data = {}
    10     Form_Data['i'] = 'love'
    11     Form_Data['from'] = 'AUTO'
    12     Form_Data['to'] = 'AUTO'
    13     Form_Data['smartresult'] = 'dict'
    14     Form_Data['client'] = 'fanyideskweb'
    15     Form_Data['doctype'] = 'json'
    16     Form_Data['version'] = '2.1'
    17     Form_Data['keyfrom'] = 'fanyi.web'
    18     Form_Data['action'] = 'FY_BY_REALTIME'
    19     Form_Data['typoResult'] = 'false'
    20     # 使用urlencode方法转换标准格式
    21     data = parse.urlencode(Form_Data).encode('utf-8')
    22     # 传递Request对象和转换完格式的数据
    23     response = request.urlopen(request_url, data)
    24     # 读取信息并解码
    25     html = response.read().decode('utf-8')
    26     # 使用json
    27     translate_results = json.loads(html)
    28     # 找到翻译结果
    29     translate_result = translate_results["translateResult"][0][0]['tgt']
    30     # 打印翻译结果
    31     print("翻译的结果是 %s" % translate_result)
    View Code

    还有一个我在上面报错的链接里的API看到了一个版本,写了一个对应匹配参数要求的爬虫。

    (原demo无法正常运行。。我是少了个包所以就自己改写了)

    对了,使用这个方法需要在有道智云注册一个账号(收费的,不过第一次注册送100)然后需要进入我的应用里创个新应用,里面的接入方式选API,就能得到一个账号密码了

    这是我修改demo后的代码

    # -*- coding: utf-8 -*-
    import sys
    import uuid
    import urllib.request
    import urllib.parse
    import hashlib
    import time
    import json
    
    
    YOUDAO_URL = 'http://openapi.youdao.com/api'
    APP_KEY = 'ID用自己的吧2333'
    APP_SECRET = '密码当然也是'
    
    
    def encrypt(signStr):
        hash_algorithm = hashlib.sha256()
        hash_algorithm.update(signStr.encode('utf-8'))
        return hash_algorithm.hexdigest()
    
    
    def truncate(q):
        if q is None:
            return None
        size = len(q)
        return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]
    
    
    def do_request(data):
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        return urllib.request.Request(YOUDAO_URL, data=data, headers=headers)
    
    
    q = input("请输入查询的单词:
    ")
    
    data = {}
    data['from'] = 'EN'
    data['to'] = 'zh-CHS'
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = q
    data['salt'] = salt
    data['sign'] = sign
    data = urllib.parse.urlencode(data).encode('utf-8')
    req = do_request(data)
    response = urllib.request.urlopen(req)
    html = response.read().decode()
    target = json.loads(html)
    print(target['web'][0]['value'])
    #上面的输出可以自己定义,输出target看自己需求输出吧
  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/llllrj/p/10501951.html
Copyright © 2011-2022 走看看