使用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
相关产品推荐
相关产品推荐

