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

使用BeautifulSoup爬取Zalando页面仅获部分品牌名问题求助

解决Zalando男鞋页面品牌爬取不全的问题

嘿,我懂你遇到的麻烦了——直接用urllib或requests请求页面只能拿到35个品牌,但把页面存本地后就能获取全部84个。这其实是动态内容加载在搞鬼:Zalando的商品列表不会一次性返回所有内容,初始请求只加载页面可见的部分,剩下的得等你滚动页面时,通过JavaScript异步加载出来。直接请求静态HTML自然拿不到后续加载的内容。

下面给你两个靠谱的解决方案,按需选择:

方案1:用Selenium模拟浏览器(上手简单)

Selenium能模拟真实浏览器的操作,包括滚动页面触发加载,这样就能把所有商品都拉取下来。

操作步骤:

  1. 先安装Selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配哦)
  2. 用下面的代码模拟滚动直到所有内容加载完成:
from bs4 import BeautifulSoup
from selenium import webdriver
import time

url = "https://www.zalando.nl/herenschoenen/"

# 初始化Chrome浏览器(确保ChromeDriver路径正确,或者配置到环境变量里)
driver = webdriver.Chrome()
driver.get(url)

# 循环滚动页面,直到没有新内容加载
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 给JS留一点加载时间,可根据网络情况调整
    time.sleep(2)
    # 检查新的滚动高度,和上次一样就说明加载完了
    new_scroll_height = driver.execute_script("return document.body.scrollHeight")
    if new_scroll_height == last_scroll_height:
        break
    last_scroll_height = new_scroll_height

# 获取完整的页面源码,然后关闭浏览器
page_source = driver.page_source
driver.quit()

# 解析页面提取品牌名
soep = BeautifulSoup(page_source, 'lxml')
articles = soep.find_all("article")

brand_list = []
for article in articles:
    try:
        brand = article.find(class_="cat_brandName-2XZRz cat_ellipsis-MujnT").get_text().strip()
        brand_list.append(brand)
    except AttributeError:
        continue

print(f"总共拿到{len(brand_list)}个品牌:")
for brand in brand_list:
    print(brand)

方案2:直接调用API(更高效)

如果不想用浏览器模拟,还可以抓包找Zalando加载商品的API接口,直接请求接口拿数据,速度更快。

操作步骤:

  1. 打开Chrome的开发者工具(按F12),切换到「Network」标签
  2. 慢慢滚动页面,观察XHR类型的请求,找到加载商品列表的接口(通常路径里会有catalog或articles这类关键词)
  3. 复制接口的URL、请求参数和请求头,用requests直接请求:
import requests

# 替换成你抓包到的真实API地址
api_url = "https://www.zalando.nl/api/catalog/articles"
# 参数根据抓包结果调整,比如设置limit为84就能拿到全部商品
params = {
    "categories": "herenschoenen",
    "limit": 84,
    "sort": "popularity",
    # 其他参数比如offset、size等,从抓包的请求里复制
}

# 请求头要模拟真实浏览器,避免被拦截
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",
    "Referer": "https://www.zalando.nl/herenschoenen/"
}

response = requests.get(api_url, params=params, headers=headers)
data = response.json()

# 直接从返回的JSON里提取品牌名
brand_list = [item["brand_name"] for item in data["articles"]]
print(f"总共拿到{len(brand_list)}个品牌:")
for brand in brand_list:
    print(brand)

小提醒

  • 用Selenium时,记得把浏览器驱动和浏览器版本对齐,不然会报错
  • 调用API的话,接口参数可能会随时变,要是哪天不好使了,再重新抓包看看就行;另外别太频繁请求,小心被网站反爬拦截
  • 不管用哪种方法,都记得加个合理的User-Agent,模拟真实用户的请求哦

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:22:35