亚马逊折扣抓取程序优化及AttributeError问题排查求助
亚马逊英国黑五商品爬虫问题解决与功能优化
一、AttributeError错误修复
- 错误原因:DataFrame中不存在名为
saleprice的列,通常是以下两种情况导致:- 爬取商品数据时,售价字段的提取逻辑错误,未成功获取到对应数据
- 代码中列名拼写/格式不统一(比如实际列名是
sale_price、SalePrice,或大小写不一致)
- 修复方案:
- 检查爬虫提取售价的代码,确认HTML选择器是否匹配当前亚马逊页面结构,确保能正确抓取售价,且存储到DataFrame时列名统一为
saleprice(或与后续调用逻辑一致) - 统一列引用方式:改用
df['saleprice']替代df.saleprice,索引式引用对大小写、特殊字符列名的兼容性更强
- 检查爬虫提取售价的代码,确认HTML选择器是否匹配当前亚马逊页面结构,确保能正确抓取售价,且存储到DataFrame时列名统一为
二、功能优化实现
1. 运行时打印结果
在保存CSV前添加打印逻辑,可通过to_string()避免表格内容被截断:
# 打印完整抓取结果 print("黑五商品折扣详情:") print(df.to_string())
2. 以列表/数组形式展示结果
将DataFrame转换为嵌套列表或NumPy数组:
# 转换为嵌套列表 result_list = df.values.tolist() print("\n结果列表形式:") print(result_list) # 转换为NumPy数组(需提前导入numpy) import numpy as np result_array = df.to_numpy() print("\n结果数组形式:") print(result_array)
三、完整优化后代码示例
import requests from bs4 import BeautifulSoup import pandas as pd import numpy as np import time # 亚马逊英国黑五专区URL(需根据实际页面更新) URL = "https://www.amazon.co.uk/deals" 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" } def scrape_amazon_black_friday(): response = requests.get(URL, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') products = [] # 商品卡片选择器需根据当前页面结构调整 for item in soup.select(".dealGridItem"): product = {} # 提取标题 title_tag = item.select_one(".a-size-base-plus") product["title"] = title_tag.get_text(strip=True) if title_tag else "无标题" # 提取商品链接 link_tag = item.select_one("a.a-link-normal") product["link"] = "https://www.amazon.co.uk" + link_tag["href"] if link_tag else "无链接" # 提取售价(确保列名为saleprice) sale_price_tag = item.select_one(".a-price-whole") if sale_price_tag: price_text = sale_price_tag.get_text(strip=True).replace(",", "") product["saleprice"] = float(price_text) if price_text else None else: product["saleprice"] = None # 提取原价 original_price_tag = item.select_one(".a-price.a-text-price .a-offscreen") if original_price_tag: original_text = original_price_tag.get_text(strip=True).replace("£", "").replace(",", "") product["originalprice"] = float(original_text) if original_text else None else: product["originalprice"] = None # 提取评论数 review_tag = item.select_one(".a-size-small .a-size-base") product["reviews"] = int(review_tag.get_text(strip=True).replace(",", "")) if review_tag and review_tag.get_text().isdigit() else 0 products.append(product) time.sleep(1) # 添加延迟避免反爬 # 转换为DataFrame df = pd.DataFrame(products) # 计算折扣率(处理空值避免报错) df["discount_rate"] = np.where( df["originalprice"].notna() & df["saleprice"].notna(), round(((df["originalprice"] - df["saleprice"]) / df["originalprice"]) * 100, 2), None ) # 功能1:打印结果 print("黑五商品折扣详情:") print(df.to_string()) # 功能2:转换为列表和数组展示 result_list = df.values.tolist() print("\n结果列表形式:") print(result_list) result_array = df.to_numpy() print("\n结果数组形式:") print(result_array) # 保存为CSV df.to_csv("amazon_black_friday_deals.csv", index=False, encoding="utf-8-sig") print("\n数据已保存为amazon_black_friday_deals.csv") if __name__ == "__main__": scrape_amazon_black_friday()
四、注意事项
- 亚马逊页面结构会频繁更新,需定期检查并调整HTML选择器
- 频繁请求可能触发反爬,建议增加请求延迟或使用代理IP
- 数据处理阶段需严格处理空值,避免计算或存储时出现异常
内容的提问来源于stack exchange,提问作者Lokesh Raj
相关产品推荐
相关产品推荐

