IndexError: list index out of range爬虫报错

用python爬虫报错
IndexError: list index out of range
查了一下txt文件没有错误

img

# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession
from pyspark.sql.types import IntegerType


def spark_analyse(filename):
    print("开始spark分析")
    # 程序主入口
    spark = SparkSession.builder.master("local").appName("rent_analyse").getOrCreate()
    df = spark.read.csv(filename, header=True)

    # max_list存储各个区的最大值,0海沧,1为湖里,2为集美,3为思明,4为翔安,5为同安;同理的mean_list, 以及min_list,approxQuantile中位数
    max_list = [0 for i in range(6)]
    mean_list = [1.2 for i in range(6)]
    min_list = [0 for i in range(6)]
    mid_list = [0 for i in range(6)]
    # 类型转换,十分重要,保证了price列作为int用来比较,否则会用str比较, 同时排除掉一些奇怪的价格,比如写字楼的出租超级贵
    # 或者有人故意标签1元,其实要面议, 还有排除价格标记为面议的
    df = df.filter(df.price != '面议').withColumn("price", df.price.cast(IntegerType()))
    df = df.filter(df.price >= 50).filter(df.price <= 40000)

    mean_list[0] = df.filter(df.area == "海沧").agg({"price": "mean"}).first()['avg(price)']
    mean_list[1] = df.filter(df.area == "湖里").agg({"price": "mean"}).first()['avg(price)']
    mean_list[2] = df.filter(df.area == "集美").agg({"price": "mean"}).first()['avg(price)']
    mean_list[3] = df.filter(df.area == "思明").agg({"price": "mean"}).first()['avg(price)']
    mean_list[4] = df.filter(df.area == "翔安").agg({"price": "mean"}).first()['avg(price)']
    mean_list[5] = df.filter(df.area == "同安").agg({"price": "mean"}).first()['avg(price)']

    min_list[0] = df.filter(df.area == "海沧").agg({"price": "min"}).first()['min(price)']
    min_list[1] = df.filter(df.area == "湖里").agg({"price": "min"}).first()['min(price)']
    min_list[2] = df.filter(df.area == "集美").agg({"price": "min"}).first()['min(price)']
    min_list[3] = df.filter(df.area == "思明").agg({"price": "min"}).first()['min(price)']
    min_list[4] = df.filter(df.area == "翔安").agg({"price": "min"}).first()['min(price)']
    min_list[5] = df.filter(df.area == "同安").agg({"price": "min"}).first()['min(price)']

    max_list[0] = df.filter(df.area == "海沧").agg({"price": "max"}).first()['max(price)']
    max_list[1] = df.filter(df.area == "湖里").agg({"price": "max"}).first()['max(price)']
    max_list[2] = df.filter(df.area == "集美").agg({"price": "max"}).first()['max(price)']
    max_list[3] = df.filter(df.area == "思明").agg({"price": "max"}).first()['max(price)']
    max_list[4] = df.filter(df.area == "翔安").agg({"price": "max"}).first()['max(price)']
    max_list[5] = df.filter(df.area == "同安").agg({"price": "max"}).first()['max(price)']

    # 返回值是一个list,所以在最后加一个[0]
    #列表越界,下标超出范围,

    mid_list[0] = df.filter(df.area == "海沧").approxQuantile("price", [0.5], 0.01)[0]
    mid_list[1] = df.filter(df.area == "湖里").approxQuantile("price", [0.5], 0.01)[0]
    mid_list[2] = df.filter(df.area == "集美").approxQuantile("price", [0.5], 0.01)[0]
    mid_list[3] = df.filter(df.area == "思明").approxQuantile("price", [0.5], 0.01)[0]
    mid_list[4] = df.filter(df.area == "翔安").approxQuantile("price", [0.5], 0.01)[0]
    mid_list[5] = df.filter(df.area == "同安").approxQuantile("price", [0.5], 0.01)[0]

    all_list = []
    all_list.append(min_list)
    all_list.append(max_list)
    all_list.append(mean_list)
    all_list.append(mid_list)

    print("结束spark分析")

    return all_list

这个问题可能是因为approxQuantile方法返回的列表为空,这通常发生在指定的分位数没有匹配的结果时。

在你的代码中,你调用了approxQuantile("price", [0.5], 0.01)。这表示你想得到中位数(50%分位数)的价格。然而,如果你的数据中没有任何价格满足这个条件,方法就会返回一个空列表,而你的代码在尝试访问列表的第一个元素时就会报错。

一个可能的解决方案是检查返回的列表是否为空,如果为空则设置一个默认值。例如:

mid_price = df.filter(df.area == "海沧").approxQuantile("price", [0.5], 0.01)
mid_list[0] = mid_price[0] if mid_price else None

在这个例子中,如果mid_price列表为空(即没有找到满足条件的价格),那么就将mid_list[0]设置为None。这样就能避免出现列表越界错误。

在实际运用中,你可能需要根据具体情况来决定使用什么样的默认值。如果None不适合你的程序,你可能需要使用其他值来替代。

请注意,这只是一个可能的解决方案,实际问题可能需要更深入的调试才能准确找出。