使用requests和BeautifulSoup爬虫时无法通过class定位span元素
问题原因分析
- 核心原因是该网站的促销商品内容为JavaScript动态渲染:你在浏览器开发者工具里看到的HTML结构是页面加载完成后JS执行渲染出来的,而
requests库只能拿到初始的静态HTML源码,这份源码里根本不存在你要找的带对应class的span标签,所以匹配结果为空。 - 次要排查点:
requests默认的请求头会被很多网站识别为爬虫,有可能你拿到的返回结果本身就是网站的拦截/验证页面,而非正常的促销商品页。可以先打印response.status_code和response.text确认返回内容是否符合预期。
可行解决方案
方案1:使用支持JS渲染的工具抓取(适合快速实现)
用Selenium、Playwright这类无头浏览器工具模拟真实浏览器加载页面,等JS执行完成后再解析DOM,示例代码如下:
# 提前安装依赖:pip install selenium webdriver-manager from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time url = 'https://www.ah.nl/bonus' # 初始化Chrome浏览器(自动匹配对应版本的驱动) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) # 等待页面内容加载完成,也可以用Selenium的显式等待指定元素出现,效率更高 time.sleep(3) # 读取渲染完成的完整页面源码 soup = BeautifulSoup(driver.page_source, 'html.parser') product_spans = soup.find_all('span', {'class': 'line-clamp_root__3yA0X line-clamp_active__2502b'}) # 提取所有商品名 product_names = [span.get_text(strip=True) for span in product_spans] print(product_names) # 关闭浏览器进程 driver.quit()
方案2:直接抓取数据接口(效率更高)
打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR请求,刷新页面后找到返回促销商品数据的接口,直接请求该接口拿到结构化的JSON数据,无需解析HTML,性能和稳定性都更好。
注意事项
- 爬虫请求时建议添加合法的
User-Agent请求头,控制请求频率,避免触发网站的反爬策略。 - 抓取数据前请确认符合目标网站的robots协议和使用条款。
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

