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

Python Pandas多索引DataFrame爬虫翻页数据留存问题求助

解决爬虫翻页时DataFrame数据丢失的问题

嘿,这个问题我太熟了!你现在遇到的核心问题是每次翻页循环都重新创建了DataFrame,导致上一页的数据直接被覆盖掉了。咱们来一步步解决它~

核心问题分析

看你的代码片段,每次进入循环都会执行这行:

data = pd.DataFrame({'site':'MICHELIN','name': '', ...}, index = [j,i])

这相当于每次翻页都新建了一个空的DataFrame,之前爬取的内容自然就丢失了。正确的做法是把数据容器(要么是总DataFrame,要么是临时列表)放到循环外面,每次只把新页的数据追加进去。

方法一:提前初始化总DataFrame,逐页合并

这种方法适合数据量中等的情况,思路是先定义好空的总DataFrame,每爬完一页就把当前页的数据合并进去:

import pandas as pd

# 第一步:在循环外初始化空的总DataFrame,定义好所有列名
columns = ['site', 'name', 'pdv_url', 'rating', 'address', 'web', 'phone', 'map', 'email', 'id', 'datetime']
total_data = pd.DataFrame(columns=columns)

j = 1
try:
    while True:
        url_next = f'https://www.viamichelin.es/web/Restaurantes/Restaurantes-Espana?page={j}'
        print(url_next)
        
        # 假设你的fetchURL函数会返回当前页的餐厅数据,比如一个小DataFrame或者列表字典
        current_page_data = fetchURL(url_next)
        
        # 如果当前页没有数据,说明到最后一页了,退出循环
        if not current_page_data:
            break
        
        # 将当前页数据合并到总DataFrame(用concat替代已弃用的append)
        if isinstance(current_page_data, pd.DataFrame):
            total_data = pd.concat([total_data, current_page_data], ignore_index=True)
        else:
            # 如果返回的是列表字典,先转成DataFrame再合并
            current_df = pd.DataFrame(current_page_data)
            total_data = pd.concat([total_data, current_df], ignore_index=True)
        
        j += 1
except Exception as e:
    print(f"爬取过程出错:{str(e)}")

# 最后可以把数据保存到文件
total_data.to_csv('michelin_restaurants.csv', index=False)

方法二:先用列表收集所有数据,最后转成DataFrame

如果爬取的页数很多,这种方法效率更高(因为列表的追加操作比多次合并DataFrame开销小):

import pandas as pd

# 第一步:在循环外初始化空列表,用来存所有餐厅数据
all_restaurants = []
columns = ['site', 'name', 'pdv_url', 'rating', 'address', 'web', 'phone', 'map', 'email', 'id', 'datetime']

j = 1
try:
    while True:
        url_next = f'https://www.viamichelin.es/web/Restaurantes/Restaurantes-Espana?page={j}'
        print(url_next)
        
        # fetchURL返回当前页的餐厅数据(每个元素是一个包含所有字段的字典)
        current_page_list = fetchURL(url_next)
        
        if not current_page_list:
            break
        
        # 把当前页的数据加到总列表里
        all_restaurants.extend(current_page_list)
        
        j += 1
except Exception as e:
    print(f"爬取过程出错:{str(e)}")

# 最后一次性把列表转成DataFrame
total_data = pd.DataFrame(all_restaurants, columns=columns)
total_data.to_csv('michelin_restaurants.csv', index=False)

关键注意点

  1. 修改fetchURL函数:确保它能返回当前页的有效数据(要么是小DataFrame,要么是列表字典),而不是只处理页面不返回结果。
  2. 退出循环的条件:你需要自己判断什么时候没有下一页了(比如当前页没有数据、找不到下一页按钮等),避免无限循环。
  3. 索引问题:用ignore_index=True可以避免合并时的索引混乱,让DataFrame自动生成连续的索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:22:10