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

使用Selenium与Requests-HTML爬取网页无法获取全部产品链接的问题排查求助

解决Web Scraping中懒加载导致产品链接抓取不全的问题

我之前也碰到过类似的电商网站爬取问题,你的情况明显是页面采用了滚动式懒加载机制——只有当用户滚动到页面底部时,网站才会异步加载更多产品内容。你的代码只获取了初始加载的部分,没有触发后续的加载逻辑,所以拿到的链接数量远少于实际显示的150+。下面分别针对Selenium和Requests-HTML给出具体的解决方案:

一、Selenium 修改方案:模拟滚动加载所有内容

Selenium可以直接模拟浏览器的滚动行为,我们需要循环滚动到底部,直到页面高度不再变化(说明没有更多内容可加载)。修改后的代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep

options = Options()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
DRIVER_PATH = 'C:/chromedriver'

# 初始化浏览器
driver = webdriver.Chrome(executable_path=DRIVER_PATH, options=options)
driver.get('https://www.beliani.de/sofas/ledersofa/')

# 循环滚动加载所有产品
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到当前页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待异步加载完成(根据网络情况调整时间)
    sleep(5)
    # 获取新的页面高度
    new_scroll_height = driver.execute_script("return document.body.scrollHeight")
    
    # 如果高度不再变化,说明加载完毕
    if new_scroll_height == last_scroll_height:
        break
    last_scroll_height = new_scroll_height

# 抓取所有产品链接(注意获取href属性,并去重)
product_links = []
for a_tag in driver.find_elements_by_xpath('//*[@id="offers_div"]/div/div/a'):
    link = a_tag.get_attribute('href')
    if link and link not in product_links:
        product_links.append(link)

print(f"共抓取到 {len(product_links)} 条产品链接")
driver.quit()

关键改进点:

  • 新增滚动循环逻辑,确保所有懒加载内容都被触发加载
  • 提取href属性而非直接存储元素对象(避免后续元素失效)
  • 添加去重逻辑,防止重复链接被计入

二、Requests-HTML 修改方案:执行滚动脚本多次渲染

Requests-HTML的render()方法可以执行JS,但默认只渲染一次。我们可以多次执行滚动脚本,强制页面加载更多内容:

from requests_html import HTMLSession

url = 'https://www.beliani.de/sofas/ledersofa/'
session = HTMLSession()
response = session.get(url)

# 多次执行滚动脚本,触发懒加载(次数可根据实际情况调整)
for _ in range(10):
    # 滚动到页面底部,然后等待3秒让内容加载
    response.html.render(sleep=3, script="window.scrollTo(0, document.body.scrollHeight);")

# 提取所有产品链接并去重
product_container = response.html.xpath('//*[@id="offers_div"]', first=True)
product_links = list(set(product_container.absolute_links))

print(f"共抓取到 {len(product_links)} 条产品链接")
session.close()

关键改进点:

  • 循环执行滚动脚本,触发多次懒加载
  • 使用set()去重,避免重复链接被统计

额外注意事项

  1. 等待时间调整:sleep()的时间要根据你的网络速度调整,过短可能导致内容未加载完成,过长则浪费时间。
  2. 选择器稳定性:依赖id的XPath(如//*[@id="offers_div"]/div/div/a)可能会随着网站结构变化失效,建议改用更稳定的类选择器,比如//div[contains(@class, 'product-item')]/a(具体类名需要查看页面源码确认)。
  3. 反爬机制:如果后续遇到抓取限制,可以尝试添加随机等待时间、更换用户代理或使用代理IP,避免被网站封禁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:22:41