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

网页爬虫多页循环时触发IndexError索引越界问题求助

问题排查与修复方案

核心错误原因

  • 链接列表被重复重置:linksList = []写在分页循环内部,每爬一页就清空之前的链接,最终仅保留最后一页的车辆链接。
  • 索引越界风险:部分车辆详情页的vd-spec-value元素数量不足9个,直接通过values[0]到values[8]硬编码取值会触发IndexError。
  • 代码缩进错误:data.append(...)写在车辆详情循环外部,最终只会把最后一条车辆数据加入列表。
  • 元素查找无容错:如果页面中找不到total-price、make等元素,会直接抛出AttributeError中断爬虫。

修复后的完整代码

import requests
import pandas as pd
from bs4 import BeautifulSoup

# 初始化链接列表在分页循环外,避免重复清空
linksList =[]
for page in range(1,3):
    link = 'https://www.theaa.com/used-cars/displaycars?fullpostcode=&travel=2000&page='+str(page)
    r = requests.get(link,headers = {'User-agent': 'your bot 0.5'})
    soup = BeautifulSoup(r.content, 'html.parser')
    # 追加当前页的车辆链接
    for link in soup.find_all('a',class_='black-link'):
        url = link['href']
        linksList.append('https://www.theaa.com/'+url)

data=[]
for i in linksList:
    try:
        page=requests.get(i,headers = {'User-agent': 'your bot 0.5'})
        soup_inside = BeautifulSoup(page.content,'html.parser')
        vehicle_values = soup_inside.find_all('span',class_='vd-spec-value')
        values=[v.text.strip() for v in vehicle_values]
        
        # 安全取值:判断列表长度,不足时填充默认值
        mileage = values[0] if len(values)>=1 else 'N/A'
        year = values[1] if len(values)>=2 else 'N/A'
        fuel_type = values[2] if len(values)>=3 else 'N/A'
        transmission = values[3] if len(values)>=4 else 'N/A'
        body_type = values[4] if len(values)>=5 else 'N/A'
        colour = values[5] if len(values)>=6 else 'N/A'
        doors = values[6] if len(values)>=7 else 'N/A'
        engine_size = values[7] if len(values)>=8 else 'N/A'
        emissions = values[8] if len(values)>=9 else 'N/A'
        
        # 元素查找容错:先判断元素是否存在,避免报错
        price_elem = soup_inside.find('strong',class_='total-price new-transport--bold')
        price = price_elem.text.strip() if price_elem else 'N/A'
        
        company_elem = soup_inside.find('span',class_='make')
        company = company_elem.text.strip() if company_elem else 'N/A'
        
        model_elem = soup_inside.find('span',class_='model')
        model = model_elem.text.strip() if model_elem else 'N/A'
        
        variant_elem = soup_inside.find('span',class_='variant new-transport--regular')
        variant = variant_elem.text.strip() if variant_elem else 'N/A'
        
        # 修正缩进:每条车辆数据爬取完成后立即加入列表
        data.append([mileage,year,fuel_type,transmission,body_type,colour,doors,engine_size,emissions,price,company,model,variant])
    except Exception as e:
        print(f"处理链接{i}时出错: {str(e)}")
        continue

# 转为DataFrame查看结果
df = pd.DataFrame(data, columns=['里程','年份','燃油类型','变速箱','车身类型','颜色','车门数','发动机排量','排放量','价格','品牌','车型','版本'])
print(df.head())

关键修复点说明

  • 链接列表持久化:将linksList = []移到分页循环外部,确保所有页面的车辆链接都被收集。
  • 安全索引取值:通过判断values的长度决定是否取值,不足时填充N/A,彻底避免索引越界。
  • 元素查找容错:对每个需要提取的元素先判断是否存在,不存在时用N/A替代,防止爬虫因单条数据异常中断。
  • 修正缩进逻辑:把data.append(...)放入车辆详情循环内部,保证每条爬取到的车辆数据都能被加入列表。
  • 全局异常捕获:用try-except包裹单条车辆的处理逻辑,遇到错误时打印信息并继续处理下一条,提升爬虫稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:47:08