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

