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

如何抓取滚动加载的电商网页中更多商品数据?

解决滚动加载商品数据的抓取问题

问题描述

编写了一个脚本抓取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无需渲染页面,效率更高。

操作步骤:

  1. 打开浏览器开发者工具(F12),切换到「网络」标签页
  2. 下滑页面,观察XHR类型的请求,找到加载商品列表的接口(Trendyol的接口通常包含listing或infinite-scroll关键词)
  3. 分析请求参数(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:05:18