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)
关键注意点
- 修改fetchURL函数:确保它能返回当前页的有效数据(要么是小DataFrame,要么是列表字典),而不是只处理页面不返回结果。
- 退出循环的条件:你需要自己判断什么时候没有下一页了(比如当前页没有数据、找不到下一页按钮等),避免无限循环。
- 索引问题:用
ignore_index=True可以避免合并时的索引混乱,让DataFrame自动生成连续的索引。
内容的提问来源于stack exchange,提问作者Zaera Alberto
相关产品推荐
相关产品推荐

