网页爬虫多页循环时触发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
相关产品推荐
相关产品推荐

