使用BeautifulSoup4抓取Knives下拉菜单子项名称失败,求排查
问题排查:爬取csgoskins.gg Knives下拉菜单返回空的原因及解决
1. 动态渲染导致内容未加载
csgoskins.gg的Knives下拉菜单大概率是JavaScript动态生成的。requests只能获取页面初始HTML源码,而这些下拉子项是页面加载完成后,通过JS从后端接口拉取数据或动态渲染出来的,初始源码里根本不存在这些内容,所以BeautifulSoup自然找不到。
解决办法:
- 使用
selenium或playwright模拟浏览器加载页面,等待JS执行完毕后再抓取完整DOM - 打开浏览器开发者工具(F12),切换到Network面板,筛选XHR/Fetch请求,找到加载刀具列表的API接口,直接请求该接口获取数据(这种方式比模拟浏览器更高效)
2. 选择器与实际DOM结构不匹配
你编写的BeautifulSoup选择器可能和页面真实结构不符:
- 下拉菜单默认处于隐藏状态,子项HTML可能带有
display: none等隐藏属性,你的选择器没考虑到这种状态 - 页面可能使用了动态生成的类名、ID,或者你复制的是下拉菜单展开后的DOM结构,但初始源码里的层级、标签完全不同
解决办法:
- 在浏览器Elements面板中,右键目标子项标签,选择「Copy > Copy selector」,直接复制精准的CSS选择器用于定位
- 右键页面选择「查看页面源代码」,检查初始HTML中是否存在目标子项,如果不存在,直接判定为动态渲染问题
3. 请求头缺失触发反爬机制
网站可能会校验请求头中的User-Agent、Referer等字段,requests默认发送的请求头过于简单,服务器可能返回不完整内容或空数据。
解决办法:
- 给请求添加完整的模拟浏览器请求头,示例代码:
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get('https://csgoskins.gg', headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 后续使用正确选择器定位
4. 页面加载后DOM结构被重写
部分网站会在页面加载完成后重写DOM结构,你复制的HTML是重写后的最终结构,但requests获取的是重写前的初始结构,两者差异导致定位失败。
解决办法:
- 对比「页面源代码」和「Elements面板实时DOM」的结构差异,确认是否存在DOM重写情况,若存在则按动态渲染问题处理
内容的提问来源于stack exchange,提问作者doomdaam
相关产品推荐
相关产品推荐

