如何用pandas将Selenium循环爬取的每条内容逐行写入CSV文件
Selenium爬取内容写入CSV(支持后续新增列)实现方案
原有代码错误原因
- 变量名冲突:将pandas的别名
pd赋值为DataFrame对象,覆盖了pandas模块引用 - 写入模式错误:
to_csv默认是覆盖写入模式,每次循环都会清空之前的内容,最终仅保留最后一条数据 - 语法错误:pandas的DataFrame构造方法是首字母大写的
DataFrame,不是小写dataframe
实现方案
方案1:全量收集数据后一次性写入(推荐,性能更高)
适合爬取数据量不大、不会中途中断的场景,后续新增列只需调整字典键即可自动适配:
import pandas as pd # 其他selenium相关导入省略 # 初始化列表存储所有爬取条目 data = [] prodTitle = driver.find_elements_by_xpath("//*[contains(@class,'itemTitle')]") for pTitle in prodTitle: # 用字典存储单条数据,后续新增列直接加字典键值对即可 item = { "商品标题": pTitle.text # 示例新增列:"商品价格": pPrice.text, "商品链接": pUrl.get_attribute("href") } data.append(item) print(pTitle.text) # 全部爬取完成后统一写入CSV df = pd.DataFrame(data) # index=False 去掉默认行号,encoding='utf-8-sig' 解决中文乱码问题 df.to_csv("data.csv", index=False, encoding="utf-8-sig")
方案2:循环逐行追加写入(适合爬取量大、易中断场景)
边爬边存,避免爬虫中途崩溃丢失已爬取数据:
import pandas as pd import os # 其他selenium相关导入省略 prodTitle = driver.find_elements_by_xpath("//*[contains(@class,'itemTitle')]") for pTitle in prodTitle: item = { "商品标题": pTitle.text # 新增列直接加字典键值对即可 } df = pd.DataFrame([item]) # 判断文件是否存在:不存在则写入表头,存在则追加内容不写表头 if not os.path.exists("data.csv"): df.to_csv("data.csv", index=False, encoding="utf-8-sig") else: # mode='a' 代表追加写入模式,header=False 不重复写入表头 df.to_csv("data.csv", mode="a", header=False, index=False, encoding="utf-8-sig") print(pTitle.text)
内容的提问来源于stack exchange,提问作者Ahmed Mohsen
相关产品推荐
相关产品推荐

