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])
为什么这个修复更好?
- 数据对应准确:每个商品的名称和价格都是从同一个卡片容器里抓取的,不会出现全局抓取导致的顺序/数量不匹配
- 容错性更强:即使某个商品没有名称或价格,代码会用默认值填充,不会直接报错
- 适应性更好:亚马逊的页面结构经常微调,但商品卡片的容器通常变化不会太频繁,维护成本更低
另外提醒一下:亚马逊有反爬机制,频繁请求可能会被封IP,建议添加请求延迟,不要一次性请求太频繁。
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

