使用BeautifulSoup爬取Zalando页面仅获部分品牌名问题求助
解决Zalando男鞋页面品牌爬取不全的问题
嘿,我懂你遇到的麻烦了——直接用urllib或requests请求页面只能拿到35个品牌,但把页面存本地后就能获取全部84个。这其实是动态内容加载在搞鬼:Zalando的商品列表不会一次性返回所有内容,初始请求只加载页面可见的部分,剩下的得等你滚动页面时,通过JavaScript异步加载出来。直接请求静态HTML自然拿不到后续加载的内容。
下面给你两个靠谱的解决方案,按需选择:
方案1:用Selenium模拟浏览器(上手简单)
Selenium能模拟真实浏览器的操作,包括滚动页面触发加载,这样就能把所有商品都拉取下来。
操作步骤:
- 先安装Selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配哦)
- 用下面的代码模拟滚动直到所有内容加载完成:
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接口,直接请求接口拿数据,速度更快。
操作步骤:
- 打开Chrome的开发者工具(按F12),切换到「Network」标签
- 慢慢滚动页面,观察XHR类型的请求,找到加载商品列表的接口(通常路径里会有
catalog或articles这类关键词) - 复制接口的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
相关产品推荐
相关产品推荐

