Python爬取斗鱼网站LOL分区时,获取的网页数据是经过压缩的,如何正确解压?

1.爬取网页: https://www.douyu.com/g_LOL

2.采用方法:只是初步接触爬虫,没有用额外的库。基本实现思路 :

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
url = 'https://www.douyu.com/g_LOL'

req = request.Request(url, headers=headers) r = request.urlopen(req) buff = BytesIO(r.read()) f = gzip.GzipFile(fileobj=buff) htmls = f.read().decode(‘utf-8’)

3.结果 爬取的网页中间出现了大量的数字乱码,例如:

47 14.4 14.4s-6.447 14.4-14.4 14.4z"/><path d="M20.331 18.069c0.625 0.625 0.625 1.638 0 2.263s-1.638 0.625-2.

并且,在调试到

req = request.Request(url, headers=headers)

时,弹出<string>文档,显示:</string>

 无法加载源“<string>”: Source unavailable。

4.我认为可能是对爬来的数据解压方式不对,多谢帮忙!


Python爬取斗鱼网站LOL分区时,获取的网页数据是经过压缩的,如何正确解压?

7 回复

这个是 svg,多用于图标


遇到斗鱼网页数据压缩的问题,通常是因为服务器返回了gzip压缩的响应。直接用requests库的text属性会自动解压,但如果你直接处理content可能会遇到乱码。这里给你一个完整的解决方案:

import requests
import gzip
from io import BytesIO

def fetch_douyu_lol_data():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept-Encoding': 'gzip, deflate',  # 告诉服务器支持压缩
    }
    
    url = 'https://www.douyu.com/g_LOL'  # LOL分区地址
    
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查HTTP错误
        
        # 方法1:直接使用requests自动解压(推荐)
        if response.encoding is None:
            response.encoding = 'utf-8'
        html_content = response.text
        print("自动解压成功,内容长度:", len(html_content))
        
        # 方法2:手动解压(如果需要处理原始压缩数据)
        if response.headers.get('Content-Encoding') == 'gzip':
            compressed_data = response.content
            # 使用gzip模块解压
            buffer = BytesIO(compressed_data)
            with gzip.GzipFile(fileobj=buffer, mode='rb') as f:
                decompressed_data = f.read().decode('utf-8')
            print("手动解压成功,内容长度:", len(decompressed_data))
            
        return html_content
        
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None
    except gzip.BadGzipFile as e:
        print(f"解压失败: {e}")
        return None

# 使用示例
if __name__ == "__main__":
    data = fetch_douyu_lol_data()
    if data:
        # 这里可以添加你的解析逻辑
        print("前500字符预览:", data[:500])

关键点说明:

  1. requests库默认会处理gzip压缩,直接用response.text即可
  2. 检查响应头Content-Encoding确认是否压缩
  3. 手动解压时用gzip.GzipFile处理二进制数据
  4. 记得设置正确的编码(通常UTF-8)

常见问题排查:

  • 如果看到乱码,检查编码设置
  • 如果解压失败,确认数据确实是gzip格式
  • 有些页面可能有动态加载,可能需要处理JavaScript渲染

直接用requests的自动解压就行,手动解压只是备用方案。

简单的看了看。
1. 这些 path 都是 svg
2. 可以试试用 beautifulsoup

数字乱码 XD

react 写的,有没有加后端渲染,拿不了东西。

<path d=""> 这是 SVG,d 是绘图指令

是 svg 网页矢量图 可以自己写个 html 把数据放进去 自己用浏览器打开看看

回到顶部