如何通过循环逐行填充无列无行的空pandas DataFrame?
错误原因
你当前的写法直接对空DataFrame的列赋值,既没有对应行索引承接数据,每次循环还会直接覆盖整列的所有值,自然无法逐行添加爬取到的字段。
最优解决方法
推荐先把每条数据暂存到字典列表中,全部爬取完成后一次性转为DataFrame,这种方式性能远高于循环中反复修改DataFrame,几百条数据的场景下执行效率优势很明显。
import pandas as pd import requests cids = [4100,4101,4102,4103,4104] # 先定义空列表存每条数据 data_list = [] for i in cids: # 加超时设置避免无限等待 url_info = requests.get(f'myurl/{i}/profile', timeout=10) jdata = url_info.json() # 把当前页面提取的字段拼成字典追加到列表 data_list.append({ 'Customer_id': i, 'Name': jdata['user']['profile']['Name'], # 其他要提取的字段直接在此处添加即可 # 'Age': jdata['user']['profile'].get('Age', '') }) # 全部爬取完成后一次性转DataFrame df = pd.DataFrame(data_list)
如果担心中途爬取失败丢失数据,也可以采用边爬边拼接的写法,缺点是性能略低于上述方案:
import pandas as pd import requests cids = [4100,4101,4102,4103,4104] df = pd.DataFrame() for i in cids: url_info = requests.get(f'myurl/{i}/profile', timeout=10) jdata = url_info.json() # 生成单行DataFrame row_df = pd.DataFrame([{ 'Customer_id': i, 'Name': jdata['user']['profile']['Name'], # 其他要提取的字段 }]) # 拼接新行并重置索引 df = pd.concat([df, row_df], ignore_index=True)
优化提示
给JSON字段提取加get方法,比如jdata['user']['profile'].get('Name', ''),遇到某个字段缺失时不会直接报错,会返回你设置的默认空值,大幅提升爬虫稳定性。
内容的提问来源于stack exchange,提问作者V.Nouri
相关产品推荐
相关产品推荐

