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
相关产品推荐
相关产品推荐

