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("请输入查询的单词:\n")

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看自己需求输出吧

 

posted @ 2019-03-09 16:59  llllrj  阅读(929)  评论(0编辑  收藏  举报