0%

爬虫解决重定向与中文乱码

今天发现有位网友遇到请求重定向的问题,帮忙解决之后又碰到中文乱码!再此做个记录以便日后查阅.

需求

  • 访问网址后获取302跳转的链接
    1
    url =  https://kgbook.com/e/DownSys/GetDown/?classid=21&id=4702&pathid=0
  • 需要提取Response Headers中location值(跳转地址)
    跳转地址
  • 如果用requests请求重定向的地址,在Pycharm中会出现请求不中断且不返回任何结果,此时需要在requests添加 allow_redirects=False 参数即可拒绝重定向,返回请求后的结果.

    1
    requests.get(url,allow_redirects=False)

    中文乱码

  • 返回头headers中有中文,查看content-type值为charset=utf-8,那就知道这是utf-8编码, 我再Pycharm设置的默认编码格式就是utf-8,按理来说会正常解析,但是返回的却是乱码..

    1
    requests.get(url,allow_redirects=False).headers['Location']
  • 返回结果为下图:

    在这里插入图片描述

  • 由于我之前是直接以headers[‘Location’]获取的值,那现在就直接获取headers 不加后面的中括号内容了,在请求一次

    1
    requests.get(url,allow_redirects=False).headers
  • 返回结果为下图:

    在这里插入图片描述

    这次返回的内容里,中文部分出现 \x9a\x84 此类字符,这是Unicode单字节编码(字符串的bytes形式),那么就可以先编码为unicode,在解码为utf-8

    1
    ''.encode('raw_unicode_escape').decode('UTF-8')

    完整代码

  • 可直接运行

    1
    2
    3
    4
    url = 'https://kgbook.com/e/DownSys/GetDown/?classid=21&id=4702&pathid=0'
    res = requests.get(url,allow_redirects=False).headers['Location']
    res_decode = str(res).encode('raw_unicode_escape').decode('UTF-8') # 解决Unicode编码
    print(f'https://kgbook.com{res_decode}')
  • 返回结果
    jieguo