Python3 +requests 如何调用有道翻译接口?

——前阵子爬了Steam,选择中文显示,但还是有一个抓取下来的字段时中时英,所以顺道写了一个调用有道翻译的接口,用来对抓取来的数据做翻译,调用该函数时,如果对象是中文,会被翻译成英文,如果是英文,则会翻译成中文。
——如果只需要翻译英文的话,可以写一个如为英文才调用翻译接口的判断。
——下面讲讲有道翻译接口建立的过程。

—建立有道翻译接口步骤:

1.打开有道翻译

2.打开F12

3.输入Hello

4.观察网络,看到Post里的 i 参数跟我输入的字符一致,那就清楚了

在这里插入图片描述

5.使用requests.post方法,访问接口地址,并把上图看到的参数放进一字典里提交表单,运行看看。

#coding = utf-8
import requests

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
payload = {'i':'hello',
            'action':'FY_BY_CLICKBUTTION',
            'bv':'e2a78ed30c66e16a857c5b6486a1d326',
            'client':'fanyideskweb',
            'doctype':'json',
            'from':'AUTO',
            'keyfrom':'fanyi.web',
            'salt':'15532627491296',
            'sign':'ee5b85b35c221d9be7437297600c66df',
            'smartresult':'dict',
            'to':'AUTO',
            'ts':'1553262749129',
            'typoResult':'false',
            'version':'2.1'
            }
r = requests.post(url,data=payload) #post请求,并提交表单数据
trans_json = r.json() #由F12能看出返回的数据是json格式,但python不知道,所以这边定义了返回来的数据为json格式,方便之后操作
print(trans_json) #打印看返回来的数据对不对

但是打印结果却是 {‘errorCode’: 50}
在这里插入图片描述
一开始以为是没加header的关系,但是经过检验,发现可能是有道为了防止接口被调用,在url做了手脚,
正确的接口地址应该是:http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule
也就是吧_o去掉即可,我们看下运行结果。
在这里插入图片描述

6.取得了正确的返回后,就结果提取需要的部分,可以看到src返回英文,tgt返回中文,对这两个key的value做提取,以下代码体现了对json对象取值的方法,一层一层往下找,类似Xpath。

trans_tgt = trans_json['translateResult'][0][0]['tgt'] #中文
trans_src = trans_json['translateResult'][0][0]['src'] #英文

7.代码最后做一个判断,如果输入的字符串是中文,则返回英文结果,如果输入的是英文,则返回中文结果

完整源代码:

#coding = utf-8
import requests

def Trans(str):
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    payload = {'i':str,
    'action':'FY_BY_CLICKBUTTION',
    'bv':'e2a78ed30c66e16a857c5b6486a1d326',
    'client':'fanyideskweb',
    'doctype':'json',
    'from':'AUTO',
    'keyfrom':'fanyi.web',
    'salt':'15532627491296',
    'sign':'ee5b85b35c221d9be7437297600c66df',
    'smartresult':'dict',
    'to':'AUTO',
    'ts':'1553262749129',
    'typoResult':'false',
    'version':'2.1'
               }
    r = requests.post(url,data=payload)
    trans_json = r.json() #返回结果定义为json
    trans_tgt = trans_json['translateResult'][0][0]['tgt'] #中文
    trans_src = trans_json['translateResult'][0][0]['src'] #英文
    if str == trans_tgt: #如果str为中文,则返回英文,反之
        return trans_src
    else:
        return trans_tgt