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

Python爬虫写入CSV文件时出现IndexError: list index out of range问题求助

解决亚马逊印度站爬虫的IndexError问题

这个错误的核心原因很明确:你的Names列表和Prices列表长度不一致,当你用len(Names)作为循环范围时,Prices[i]就会在i超过Prices的最大索引时抛出越界错误。

为什么会出现这种情况?大概率是这两个原因:

  • 亚马逊页面的HTML结构更新了,你之前依赖的选择器现在抓取到的名称和价格数量不匹配
  • 部分商品可能处于缺货状态,没有显示价格,导致Prices列表的元素数量比Names少

快速临时修复:基于最小长度循环

如果你想先快速解决报错问题,可以把循环改成取两个列表的最小长度,避免访问不存在的索引:

file_name = 'Laptops.csv'
with open(file_name, 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['Sr.No', 'Laptop Name', 'Prices'])
    # 取两个列表的最小长度作为循环上限
    max_len = min(len(Names), len(Prices))
    for i in range(max_len):
        writer.writerow([i, Names[i], Prices[i]])
    # 还可以把没有对应价格的商品单独处理
    if len(Names) > len(Prices):
        for i in range(len(Prices), len(Names)):
            writer.writerow([i, Names[i], "No Price Available"])

更可靠的长期修复:按商品卡片维度抓取

上面的临时方案只是规避了错误,但没有解决数据不对应的根本问题。更专业的做法是先定位每个商品的完整卡片容器,再从每个容器内抓取名称和价格,这样能保证每个商品的名称和价格是一一对应的:

修改后的完整代码:

from bs4 import BeautifulSoup
import requests
import csv

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
source = requests.get('https://www.amazon.in/s?k=Laptops&ref=nb_sb_noss_2', headers = headers).text
soup = BeautifulSoup(source, 'lxml')

file_name = 'Laptops.csv'
with open(file_name, 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Sr.No', 'Laptop Name', 'Prices'])
    
    # 定位每个商品的卡片容器(这个类名可能需要根据亚马逊页面更新调整)
    product_cards = soup.find_all('div', class_='sg-col-4-of-24 sg-col-4-of-12 s-result-item s-asin sg-col-4-of-16 sg-col s-widget-spacing-small sg-col-4-of-20')
    
    for idx, card in enumerate(product_cards, start=1):
        # 从当前卡片中抓取商品名称
        name_tag = card.find('a', class_='a-link-normal a-text-normal')
        laptop_name = name_tag.text.strip() if name_tag else "Unknown Name"
        
        # 从当前卡片中抓取价格,处理无价格的情况
        price_tag = card.find('span', class_='a-price-whole')
        laptop_price = price_tag.text if price_tag else "N/A"
        
        writer.writerow([idx, laptop_name, laptop_price])

为什么这个修复更好?

  1. 数据对应准确:每个商品的名称和价格都是从同一个卡片容器里抓取的,不会出现全局抓取导致的顺序/数量不匹配
  2. 容错性更强:即使某个商品没有名称或价格,代码会用默认值填充,不会直接报错
  3. 适应性更好:亚马逊的页面结构经常微调,但商品卡片的容器通常变化不会太频繁,维护成本更低

另外提醒一下:亚马逊有反爬机制,频繁请求可能会被封IP,建议添加请求延迟,不要一次性请求太频繁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:47:40