目录
分析百度翻译找接口
编写代码
import urllib.request
import urllib.parse
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
# post请求的参数必须要进行编码
data = {
'from': 'en',
'to': 'zh',
'query': 'spider',
'transtype': 'realtime',
'simple_means_flag': 3,
'sign': 63766.268839,
'token': '6dab4cd9524d6653409c8da4b382cf38',
'domain': 'common',
'ts': 1707741926668
}
data = urllib.parse.urlencode(data)
request = urllib.request.Request(url=url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
这里有没有发现一个很有意思的地方。
如果是get请求,那么就是用urllib.request.Request(url=url, headers=headers)
如果是post请求,那么就是用urllib.request.Request(url=url, data=data, headers=headers)
需要注意的点
POST请求的data必须是字节,不能够是字符串。
现在我们创建了data,这是一个对象,然后我们通过urlencode将这个对象变成了字符串。
但是必须再通过编码,让它变成字节形式。
修改代码
import urllib.request
import urllib.parse
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
# post请求的参数必须要进行编码
data = {
'from': 'en',
'to': 'zh',
'query': 'spider',
'transtype': 'realtime',
'simple_means_flag': 3,
'sign': 63766.268839,
'token': '6dab4cd9524d6653409c8da4b382cf38',
'domain': 'common',
'ts': 1707741926668
}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
\u672a\u77e5\u9519\u8bef
是一个 Unicode 转义序列,它表示一串中文字符。
具体来说,每一个 \u
后面的四个十六进制数字代表一个 Unicode 码点
,这个码点对应一个字符。
\u672a
对应汉字 "未"\u77e5
对应汉字 "知"\u9519
对应汉字 "错"\u8bef
对应汉字 "误"
所以,整个字符串 \u672a\u77e5\u9519\u8bef
转换成中文字符就是 "未知错误"。
虽然是未知错误,但是已经证明能够请求了。错误的原因,可能是header的构建,不够完整。
返回数据解析
从上面的报错中,我们可以看到返回的是一个json字符串类型的数据。
import urllib.request
import urllib.parse
import json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
# post请求的参数必须要进行编码
data = {
'from': 'en',
'to': 'zh',
'query': 'spider',
'transtype': 'realtime',
'simple_means_flag': 3,
'sign': 63766.268839,
'token': '6dab4cd9524d6653409c8da4b382cf38',
'domain': 'common',
'ts': 1707741926668
}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
obj = json.loads(content)
print(obj)
最后的说明
我上面使用的接口,是百度翻译的详细翻译接口,不是简单翻译的接口。
其实,应该使用下面的接口:
用这个接口的话,就很容易得到结果,如下图所示:
import urllib.request
import urllib.parse
import json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
# url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
url = 'https://fanyi.baidu.com/sug'
# post请求的参数必须要进行编码
data = {
'kw': 'spider'
}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
obj = json.loads(content)
print(obj)