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

亚马逊折扣抓取程序优化及AttributeError问题排查求助

亚马逊英国黑五商品爬虫问题解决与功能优化

一、AttributeError错误修复

  • 错误原因:DataFrame中不存在名为saleprice的列,通常是以下两种情况导致:
    1. 爬取商品数据时,售价字段的提取逻辑错误,未成功获取到对应数据
    2. 代码中列名拼写/格式不统一(比如实际列名是sale_price、SalePrice,或大小写不一致)
  • 修复方案:
    1. 检查爬虫提取售价的代码,确认HTML选择器是否匹配当前亚马逊页面结构,确保能正确抓取售价,且存储到DataFrame时列名统一为saleprice(或与后续调用逻辑一致)
    2. 统一列引用方式:改用df['saleprice']替代df.saleprice,索引式引用对大小写、特殊字符列名的兼容性更强

二、功能优化实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:50:20