请教下大家,用 Python 的 socket 模块请求 B 站有时返回乱码问题。

发布于 2022-09-11 22:25:30 字数 1356 浏览 21 评论 0

GET 请求 B 站首页,返回的数据有时能正常解码为 UTF8,有时又会解码到一半报错提示无法解码,报错时我试着先把字节存到一个文件,然后用 UTF8 可以正常解码前面的部分。 (代码手动跑个 5、6 遍,应该跟反爬虫没关联吧)。访问豆瓣 TOP250 电影( https://movie.douban.com/top250 )页面也会出现这个情况,豆瓣触发次数得跑多几遍,而且是固定位置报错,这个感觉很诡异,固定位置也不可能是传输数据丢了吧?这个问题困扰了我好几天了,望各位不吝赐教。
代码如下:

import socket, ssl

HOST = 'www.bilibili.com'

sock = socket.socket()
sock = ssl.wrap_socket(sock)
sock.connect((HOST, 443))

request = f'GET / HTTP/1.1\r\nHOST: {HOST}\r\nConnection: close\r\n\r\n'
sock.send(request.encode())

SIZE = 8192
buffer = []
while True:
    data = sock.recv(SIZE)
    if not data:
        break
    buffer.append(data)
data = b''.join(buffer)

sock.close()
data = data.split(b'\r\n\r\n', 1)[1]
print(data.decode())

提供下获取的字节文件: https://pan.baidu.com/s/17Abe... 提取码: 8ku1
报错位置在 34556,试解码前 30000 没问题。
贴下 header 部分:

HTTP/1.1 200 OK
Date: Sat, 14 Sep 2019 11:18:13 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
gear: 1
vikingrCache: 60000
Vikingr-Cache-TTL: 4376
IDC: shjd
Vary: Origin,Accept-Encoding
Expires: Sat, 14 Sep 2019 11:18:43 GMT
Cache-Control: max-age=30
X-Cache-Webcdn: BYPASS from hw-gz3-webcdn-07

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

饮湿 2022-09-18 22:25:30

https://www.cnblogs.com/xueha...

无法被解码的地方恰好是 chunck 边界,“趣味科普人文” 的 “文” 字 编码被 \r\n5dff\r\n 分开了。既然自己写socket,不用现成的http模块,就要了解和处理所有协议细节。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文