You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup与Requests爬取u.gg数据返回None及TypeError报错求助

问题根因
  • 基础反爬拦截:requests 默认的请求头UA标识为python-requests/版本号,u.gg识别到爬虫请求后会返回错误页面或空内容,你获取到的HTML源码本身不存在目标class对应的div元素,因此soup.find返回None,后续调用.prettify()时就会触发TypeError: 'NoneType' object is not callable报错。
  • 动态渲染限制:u.gg的英雄胜率、登场率等数据是前端JavaScript异步加载生成的,并非嵌入在初始静态HTML中,就算绕过反爬拿到初始页面源码,也无法直接解析到目标元素。
可落地解决方案
  • 方案1:添加请求头+抓包直连数据接口
    先给requests添加模拟浏览器的UA头绕过基础反爬,再通过浏览器F12开发者工具的「网络」面板,筛选XHR/Fetch类型请求,找到u.gg加载英雄数据的后端接口,直接请求接口获取结构化JSON数据,相比解析HTML效率更高、稳定性更强。
    基础优化代码示例:
    from bs4 import BeautifulSoup
    import requests
    
    # 模拟浏览器请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
    }
    pickrates = {}      
    source = requests.get("http://u.gg/lol/champions/aatrox/build?role=top", headers=headers).text
    soup = BeautifulSoup(source, "lxml")
    value = soup.find("div", class_="content-section champion-ranking-stats")
    # 先判空再调用方法,避免报错
    if value:
        print(value.prettify())
    else:
        print("未找到目标元素,建议抓包获取数据接口")
    
  • 方案2:使用无头浏览器渲染页面
    若数据接口有加密参数难以破解,可以使用Selenium、Playwright等无头浏览器工具,模拟真实浏览器加载页面、等待JS执行完成后再提取元素,可解决绝大多数动态渲染和基础反爬问题,缺点是运行速度慢于直接请求接口。
  • 方案3:使用官方/第三方公开游戏数据接口
    英雄联盟官方有开放的游戏数据接口,也有第三方整理好的英雄胜率、登场率等公开数据接口,直接调用接口比爬取站点稳定性更高,也不会触发站点反爬规则。

内容的提问来源于stack exchange,提问作者Mike Werner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:06:03