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)
还有一个我在上面报错的链接里的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看自己需求输出吧
适当比较,砥砺前行