如何用Python Requests+BeautifulSoup获取滚动加载页面的全部产品名?
解决滚动加载页面的全量产品爬取问题
你的代码只能拿到初始加载的12条产品,是因为该页面采用滚动加载机制——初始仅渲染部分内容,向下滚动时通过AJAX请求获取更多产品数据并追加到页面。下面提供两种可行的解决方案:
方法一:直接调用后端AJAX接口(推荐)
滚动加载时,浏览器会向后台发送API请求获取分页数据,我们可以直接抓这个接口批量请求,效率远高于模拟浏览器。
代码示例:
import requests # 基础API接口,通过page参数控制分页 base_api = "https://www.outre.com/wp-json/wc/store/products" request_params = { "category": "wigs", "per_page": 12, "orderby": "date", "order": "desc", "page": 1 } all_product_names = [] while True: res = requests.get(base_api, params=request_params) res.raise_for_status() current_page_products = res.json() # 没有更多产品时终止循环 if not current_page_products: break # 提取当前页的产品名称 for product in current_page_products: all_product_names.append(product["name"]) # 页码自增,请求下一页 request_params["page"] += 1 # 输出所有产品名称 for name in all_product_names: print(name) print(f"\n共获取到 {len(all_product_names)} 条产品信息")
方法二:用Selenium模拟浏览器滚动加载
如果不想分析接口,或者接口有反爬限制,可以用Selenium模拟真实用户滚动页面,等所有内容加载完成后再解析。
代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver = webdriver.Chrome() driver.get("https://www.outre.com/product-category/wigs/") # 模拟滚动到底部,直到没有新内容加载 last_page_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到当前页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面加载新内容,可根据实际加载速度调整等待时间 time.sleep(2) # 获取新的页面高度 new_page_height = driver.execute_script("return document.body.scrollHeight") # 高度不再变化,说明所有内容已加载完成 if new_page_height == last_page_height: break last_page_height = new_page_height # 提取所有产品名称 product_elements = driver.find_elements(By.CSS_SELECTOR, "div.title-wrapper p a") all_product_names = [elem.text for elem in product_elements] # 输出结果 for name in all_product_names: print(name) print(f"\n共获取到 {len(all_product_names)} 条产品信息") # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者Peter Yun
相关产品推荐
相关产品推荐

