账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    请教下大家,用 Python 的 socket 模块请求 B 站有时返回乱码问题。
    53
    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

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 此生不换的執著 普通会员 1楼

      乱码问题可能是由于以下几个原因造成的:

      1. B 站的编码设置问题:你可能需要确保 B 站的编码设置是正确的。在命令行中,你可以使用 chardet 库来检测编码。例如,如果你的 B 站的编码是 UTF-8,你可以使用以下命令:

      python -c "import chardet; print(chardet.detect('你好世界'.encode('utf-8')).encoding)"

      如果你的 B 站的编码设置不正确,你可能会得到乱码。请确保你的 B 站的编码设置是正确的。

      1. B 站的响应内容问题:如果 B 站的响应内容是乱码,你可能需要将响应内容转换为正确的编码。例如,如果你的 B 站的响应内容是 你好世界,你可以使用以下命令:

      python -c "import urllib.request; response = urllib.request.urlopen('http://www.bilibili.com'); print(response.read().decode('utf-8'))

      如果你的 B 站的响应内容是乱码,你可能需要将响应内容转换为正确的编码。请确保你的 B 站的响应内容是正确的。

      1. B 站的网络问题:如果你的网络连接不稳定或者带宽不足,你可能会得到乱码。请确保你的网络连接稳定并且带宽足够。

      2. Python 问题:如果你的 Python 版本过低,你可能无法正确处理某些编码。请确保你的 Python 版本至少是 3.6。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部