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

Python使用BeautifulSoup与Requests爬取ztore数据输出空DataFrame求助

问题排查及修复方案

核心问题点

  • 列表页请求未携带请求头,触发反爬限制
    循环获取商品列表的requests.get()没有传入headers参数,网站识别到爬虫请求后会直接返回拦截页或空内容,导致soup.find_all()无法匹配到任何商品元素,最终productlinks为空列表,后续详情页采集逻辑完全没有执行,自然输出空DataFrame。
  • 请求头的User-Agent格式错误
    你写的UA中Mozilla/5.0(Windows NT缺少空格,正确格式应为Mozilla/5.0 (Windows NT,部分严格的网站会校验UA格式直接拦截异常请求。
  • 分页逻辑完全无效
    你写了for x in range(1,6)循环打算翻5页,但请求URL里完全没有代入页码参数x,每次请求的都是同一页地址,就算解决反爬问题也无法实现翻页。
  • 商品数据结构错误
    你构造product变量时用的{name, price, promotion}是Python集合类型,不是键值对字典。后续调用product['name']会直接报错,你现在没有触发报错只是因为前面逻辑没有执行到这一步。
  • 类名匹配容错性低
    jsx开头的动态类名是前端框架编译生成的,网站更新后很容易变化,且你写的ProductItem 后面多了多余的空格,也可能导致匹配失败。

修正后可运行代码

import requests
from bs4 import BeautifulSoup
import pandas as pd 

baseurl = 'https://www.ztore.com'
# 修正UA格式错误
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
productlinks = []

for x in range(1,6):
    # 列表页请求加headers,可根据网站实际分页参数调整URL中的分页字段
    r = requests.get(f'https://www.ztore.com/tc/category/all/grocery/grocery-rewards?page={x}', headers=headers)
    soup = BeautifulSoup(r.content, 'lxml')
    # 用属性选择器匹配商品容器,避免类名空格、动态变化导致匹配失败
    productlist = soup.select('div[class*="ProductItem"]')
    for item in productlist:
        for link in item.find_all('a', href=True):
            productlinks.append(baseurl + link['href'])

productlist = []
for link in productlinks:
    r = requests.get(link, headers=headers)
    soup = BeautifulSoup(r.content, 'lxml')
    name = soup.find('h2', class_='jsx-891702026').text.strip()
    price = soup.find('span', class_='jsx-891702026 original').text.strip()
    promotion = soup.find('span', class_='jsx-891702026 promotion').text.strip()
    # 修正为键值对字典结构
    product = {
        'name': name,
        'price': price,
        'promotion': promotion
    }
    productlist.append(product)
    print('Saving:', product['name'])

df = pd.DataFrame(productlist)
print(df.head(15))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:00:00