使用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()去重,避免重复链接被统计
额外注意事项
- 等待时间调整:
sleep()的时间要根据你的网络速度调整,过短可能导致内容未加载完成,过长则浪费时间。 - 选择器稳定性:依赖
id的XPath(如//*[@id="offers_div"]/div/div/a)可能会随着网站结构变化失效,建议改用更稳定的类选择器,比如//div[contains(@class, 'product-item')]/a(具体类名需要查看页面源码确认)。 - 反爬机制:如果后续遇到抓取限制,可以尝试添加随机等待时间、更换用户代理或使用代理IP,避免被网站封禁。
内容的提问来源于stack exchange,提问作者karanrp
相关产品推荐
相关产品推荐

