爬虫_059_urllib post请求百度翻译

分析百度翻译找接口

image-20240212205041877

image-20240212205142136

image-20240212205109577

编写代码

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)

需要注意的点

image-20240212205916434

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)

image-20240212213316224

\u672a\u77e5\u9519\u8bef 是一个 Unicode 转义序列,它表示一串中文字符。

具体来说,每一个 \u 后面的四个十六进制数字代表一个 Unicode 码点,这个码点对应一个字符。

  • \u672a 对应汉字 "未"
  • \u77e5 对应汉字 "知"
  • \u9519 对应汉字 "错"
  • \u8bef 对应汉字 "误"

所以,整个字符串 \u672a\u77e5\u9519\u8bef 转换成中文字符就是 "未知错误"。

虽然是未知错误,但是已经证明能够请求了。错误的原因,可能是header的构建,不够完整。

返回数据解析

从上面的报错中,我们可以看到返回的是一个json字符串类型的数据。

image-20240212213812299

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)

最后的说明

我上面使用的接口,是百度翻译的详细翻译接口,不是简单翻译的接口。

其实,应该使用下面的接口:

image-20240212214537126

用这个接口的话,就很容易得到结果,如下图所示:

image-20240212214611473

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)

image-20240212213522124

posted @ 2024-02-12 21:40  准提弟子  阅读(111)  评论(0)    收藏  举报