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

使用Requests-HTML无法获取网页全部商品链接的问题求助

问题排查:Requests-HTML抓取家乐福西班牙官网商品链接失败(仅前8个可用,后续报错)

你的代码遇到两个核心问题:

  • 动态内容加载:家乐福官网的商品列表采用滚动加载机制,初始请求只返回前8个商品的静态HTML,后续商品需要页面滚动触发JS动态渲染。Requests-HTML默认的get()方法不会执行JS,因此无法获取后续商品的DOM元素。
  • 非商品节点干扰:ul.product-card-list__list下的li元素不一定都是商品卡片,可能包含广告占位、加载提示等节点,这些节点里没有a标签,调用find('a', first=True)会返回None,进而触发AttributeError。

解决方案

1. 执行JS渲染动态内容

使用Requests-HTML的render()方法模拟浏览器执行页面JS,加载完整的商品列表。首次调用会自动下载Chromium内核,需等待下载完成。

2. 增加节点存在性判断

遍历li元素时,先检查目标a标签是否存在,避免因非商品节点导致的报错。


修改后的代码

from requests_html import HTMLSession

s = HTMLSession()

url = "https://www.carrefour.es/supermercado/bebidas/refrescos/colas/cat650010/c?ic_source=portal-y-corporativo&ic_medium=menu-links&ic_content=ns"
r = s.get(url)

# 模拟滚动加载,执行JS渲染完整页面
r.html.render(scrolldown=2, sleep=1)

products = r.html.find('ul.product-card-list__list li')

for item in products:
    product_link = item.find('a', first=True)
    # 仅当a标签存在时输出链接
    if product_link:
        print(product_link.attrs["href"])

补充说明

  • scrolldown=2表示模拟向下滚动2次,每次滚动后等待1秒(sleep=1),确保动态内容加载完成。若商品数量更多,可适当增加滚动次数。
  • 若仍有部分商品未加载,可调整scrolldown数值或延长sleep时间,给JS足够的渲染时间。
  • 避免频繁请求,防止触发网站反爬机制,可适当添加请求间隔。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:00:39