【发布时间】:2022-01-22 02:12:52
【问题描述】:
我正在为 Hoymiles 监控系统开发一个网络爬虫。我可以得到的统计数据之一是历史数据,但我得到的数据格式很奇怪。经过大量的研究和在平台代码中的搜索,我发现在发出的post请求中,除了headers和payload之外,他们使用了一个参数,即responseType:“arraybuffer”。因此,经过更多研究,我发现arraybuffer是“一种用于表示通用的、固定大小的二进制数据缓冲区的数据类型”。
我的代码如下:
def plants_data_historycal(self, authorization):
payload = '''
{
"mode":3,
"date":"2022-01-20"
}
'''
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br',
'authorization': authorization,
'Content-Type': 'application/json;charset=UTF-8',
'Origin': 'https://global.hoymiles.com',
'Referer': 'https://global.hoymiles.com/platform/login',
'Cookie': cookie,
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Mobile Safari/537.36'
}
response = self.session.post(self.url+'/pvm-data/api/0/statistics/count_station_eq', headers=headers, data=payload)
if response.status_code != 200:
raise RuntimeError("A requisição falhou: %s", response)
print(response.text)
data = BeautifulSoup(response.text, 'html.parser')
data = json.loads(data.text)
return data
对我的请求的响应如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Y
pv_eqP��G�@H��[H�nH���H�0H��G���G�QH���G��H�JH�
�H`�H�1�H�ݗH@]sH��_H`j�H�!�H
BeatifulSoup 之前的 response.text
\n\x011\n\x012\n\x013\n\x014\n\x015\n\x016\n\x017\n\x018\n\x019\n\x0210\n\x0211\n\x0212\n\x0213\n\x0214\n\x0215\n\x0216\n\x0217\n\x0218\n\x0219\n\x0220\n\x0221\n\x0222\n\x0223\x12e\n\x05pv_eq\x12\\\x00��G\x00�@H��[H\x00�nH���H�\x080H\x00��G���G�Q\x00H���G��\x02H�J\x03H�\r�H`�H�1�H�ݗH@]sH��_H`j�H�!�H���H`z�H I�H
为了尝试将此字符串转换为可以理解的内容,我尝试使用 Hoymiles 主页 Chrome 浏览器 (https://global.hoymiles.com/platform/home) 的检查选项中提供的代码。从那里我发现他们用函数转换了arraybuffer
transformResponse: [
function (e) {
if ("string" == typeof e)
try {
e = JSON.parse(e);
} catch (e) {}
return e;
},
],
但即便如此,arraybuffer 还是空的。所以我把作为arraybuffer的response变成了一个Uint8Array,但是我看不懂数据是什么意思。
Uint8Array {
0: 123
1:34
10:34
11:49
12:48
13:48
14:34
15:44
16:34
17: 100
18:97
19: 116
2: 115
20: 97
21:34
22:58
23:34
24: 34
25:44
26: 34
27: 109
28: 101
29: 115
3: 116
30: 115
31: 97
32: 103
33: 101
34: 34
35: 58
36: 34
37: 116
38: 111
39: 107
4: 97
40: 101
41: 110
42: 32
43: 118
44: 101
45: 114
46: 105
47: 102
48: 121
49: 32
5: 116
50: 101
51: 114
52: 114
53: 111
54: 114
55: 46
56: 34
57: 125
6: 117
7: 115
8:34
9:58
}
有谁知道如何将其转化为可读或可理解的数据?
【问题讨论】:
-
这可能不是您要找的答案。但我总是发现使用
puppeteer库在 javascript 中进行网页抓取是一种更愉快的体验。此外,您可以很容易地在 javascript 中将数组缓冲区转换为字符串 (stackoverflow.com/questions/6965107/…)。如果你知道python学习javascript会很容易。 -
对不起,回答迟了,但我发现实际上这已经是字符串而不是字节的python答案。我试图弄清楚如何将 arraybuffer 变成 javascript 中可以理解的东西,但我做不到。我把这个arraybuffer变成了一个Uint8Array,但是我不明白数据的含义。我将编辑问题并添加数组:)
-
你有一个令牌验证错误阅读下面我的帖子,如果它对你有帮助,请接受答案:)
-
我用我收到的你的代码发了一个帖子,实际上我从请求中得到的响应是 json 格式
标签: python web-scraping arraybuffer