如何在Python Pandas爬虫逻辑不变的情况下用concat替代append
用Pandas concat替代append解决弃用警告
你遇到的是Pandas官方弃用append方法的警告,要保持原有爬虫逻辑不变的前提下替换成concat,可以有两种高效实现方式,核心都是避免在循环中频繁修改主DataFrame:
方案一:先收集数据列表再转DataFrame(推荐,性能更优)
用Python原生列表存储每条商品数据,最后一次性生成DataFrame,比循环调用concat效率更高:
import requests import pandas as pd from bs4 import BeautifulSoup url = "https://www.breuninger.com/de/damen/luxus/bekleidung-jacken-maentel/" headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", } res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text,"lxml") # 初始化空列表存储商品数据 products = [] for item in soup.select(".suchen-produkt a"): marke = item.select_one(".suchen-produkt__marke").get_text() name = item.select_one(".suchen-produkt__name").get_text() preis = item.select_one(".suchen-produkt__preis").get_text() # 将单条商品数据加入列表 products.append({'Marke':marke,'Name':name,'Preis':preis}) # 从列表生成最终DataFrame df = pd.DataFrame(products, columns=["Marke","Name","Preis"]) print(df) df.to_csv("products.csv", index=False)
方案二:用concat严格替代原append逻辑
如果要完全对应原代码“每次添加一条数据到DataFrame”的逻辑,可以将每条数据包装成小DataFrame,收集后用concat合并:
import requests import pandas as pd from bs4 import BeautifulSoup url = "https://www.breuninger.com/de/damen/luxus/bekleidung-jacken-maentel/" headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", } res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text,"lxml") # 初始化空列表存储单个数据的小DataFrame dfs = [] for item in soup.select(".suchen-produkt a"): marke = item.select_one(".suchen-produkt__marke").get_text() name = item.select_one(".suchen-produkt__name").get_text() preis = item.select_one(".suchen-produkt__preis").get_text() # 生成单条数据的小DataFrame并加入列表 df_item = pd.DataFrame([{'Marke':marke,'Name':name,'Preis':preis}]) dfs.append(df_item) # 合并所有小DataFrame,ignore_index=True重置索引 df = pd.concat(dfs, ignore_index=True) print(df) df.to_csv("products.csv", index=False)
关键修改说明
- 移除原代码中初始化空DataFrame的操作,改用列表存储中间数据
- 循环中不再直接修改主DataFrame,避免频繁创建新对象
- 循环结束后一次性生成或合并DataFrame,彻底消除弃用警告
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

