如何抓取滚动加载的电商网页中更多商品数据?
解决滚动加载商品数据的抓取问题
问题描述
编写了一个脚本抓取Trendyol网站的男士T恤商品数据,但网站采用滚动加载模式,下滑时才会加载更多商品,当前用requests+BeautifulSoup只能获取初始加载的少量商品,无法获取足够数据。当前代码如下:
from bs4 import BeautifulSoup import requests url = "https://www.trendyol.com/erkek-t-shirt-x-g2-c73" html_text = requests.get(url).text main_soup = BeautifulSoup(html_text, 'lxml') all_items = main_soup.find_all('div', class_="p-card-wrppr with-campaign-view") for item in all_items: title = item.find('div', class_="prdct-desc-cntnr-ttl-w two-line-text").text print(title) print()
两种可行解决方案
方案1:用Selenium模拟浏览器滚动加载
滚动加载是前端监听滚动事件触发新内容加载,用Selenium可以模拟真实浏览器的滚动操作,等页面加载更多商品后再解析。
操作步骤:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver),确保和浏览器版本匹配
示例代码:
from bs4 import BeautifulSoup from selenium import webdriver import time # 初始化Chrome浏览器驱动(需提前配置好ChromeDriver路径) driver = webdriver.Chrome() driver.get("https://www.trendyol.com/erkek-t-shirt-x-g2-c73") # 模拟滚动加载,这里设置滚动5次,可按需调整次数 for _ in range(5): # 执行JS脚本滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载,时间可根据网站加载速度调整 time.sleep(2) # 获取加载完成后的页面源码 html_text = driver.page_source main_soup = BeautifulSoup(html_text, 'lxml') all_items = main_soup.find_all('div', class_="p-card-wrppr with-campaign-view") # 提取并打印商品标题 for item in all_items: title = item.find('div', class_="prdct-desc-cntnr-ttl-w two-line-text").text.strip() print(title) print() # 关闭浏览器 driver.quit()
方案2:直接调用后端API接口(更高效)
多数滚动加载的网站会通过AJAX请求从后端API获取新数据,直接调用这些API无需渲染页面,效率更高。
操作步骤:
- 打开浏览器开发者工具(F12),切换到「网络」标签页
- 下滑页面,观察XHR类型的请求,找到加载商品列表的接口(Trendyol的接口通常包含
listing或infinite-scroll关键词) - 分析请求参数(比如
page分页、size每页数量等),构造请求
示例代码(接口参数可能随网站更新变化,需自行验证):
import requests # 替换为实际找到的API接口URL api_url = "https://public.trendyol.com/discovery-web-searchgw-service/v2/api/infinite-scroll/erkek-t-shirt-x-g2-c73" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 循环获取前5页数据,可按需调整页数 for page in range(1, 6): params = { "page": page, "size": 24, "sort": "relevance" } response = requests.get(api_url, headers=headers, params=params) data = response.json() # 根据API返回的JSON结构提取商品名称 for product in data["result"]["products"]: print(product["name"]) print()
注意:API接口和参数可能随网站更新变化,需定期验证;频繁请求可能触发反爬机制,建议添加合理的请求间隔。
内容的提问来源于stack exchange,提问作者Berk Efe Keskin
相关产品推荐
相关产品推荐

