You need to enable JavaScript to run this app. Python网页爬取:for循环创建独立Person类实例解决CSV逐行重复追加问题
优惠活动
大模型
产品
解决方案
定价
更多

Python网页爬取:for循环创建独立Person类实例解决CSV逐行重复追加问题

问题根因定位

你遇到的批量爬取时CSV列值附带历史结果的异常,核心是linkedin_scraper库的Person类存在设计问题:它将所有存储爬取结果的字段(name、about、job_title等)定义为类变量而非实例变量。
即使你在循环中每次新建Person实例,所有实例会共享同一份类变量的存储区域,新的爬取结果会直接叠加在旧的类变量值上,最终出现数据串入的问题。
在无法修改Person类源码、无法新增reset方法的前提下,只需在每次实例化前手动清空Person类上的共享类变量,即可实现完全隔离的独立实例效果,和手动逐个实例化person1、person2、person3的预期完全一致。

修正后可直接运行的完整代码

# Import libraries
from linkedin_scraper import Person, actions
from selenium import webdriver
import csv
import os
import pandas as pd

# 读入联系人列表
contacts = pd.read_csv("/Users/Desktop/ContactList.csv")
names = contacts['contact_name'].tolist()
urls = contacts['contact_url'].tolist()
contact_dict = {names[i]: urls[i] for i in range(len(names))}
print(contact_dict)

# 自动登录LinkedIn
driver = webdriver.Chrome('/Users/Downloads/chromedriver')
email = os.environ.get('LINKEDIN_USER')
password = os.environ.get('LINKEDIN_PASS')
actions.login(driver, email, password)

# CSV表头定义
fields = ['name', 'about', 'job_title', 'location','company',
          'education','accomplishments','linkedin_url']

# 初始化CSV并写入表头
with open('ScrapeResults.csv', 'w', newline='', encoding='utf-8') as f:
    write = csv.writer(f)
    write.writerow(fields)

# 循环遍历URL批量爬取
for individual, link in contact_dict.items():
    # 核心修复逻辑:创建实例前重置Person类的共享类变量
    # 切断不同实例间的数据共享链路,实现独立存储
    Person.name = None
    Person.about = None
    Person.job_title = None
    Person.location = None
    Person.company = None
    Person.educations = None
    Person.accomplishments = None
    Person.linkedin_url = None

    # 为当前URL创建独立的Person实例
    person = Person(link, driver=driver, close_on_complete=False)

    # 构造当前URL的爬取结果行
    rows = [[
        person.name, 
        person.about, 
        person.job_title, 
        person.location, 
        person.company,
        person.educations, 
        person.accomplishments, 
        person.linkedin_url
    ]]

    # 追加写入爬取结果
    with open('ScrapeResults.csv', 'a', newline='', encoding='utf-8') as f:
        write = csv.writer(f)
        write.writerows(rows)

细节优化说明

  • 移除了原代码中冗余的f.close()调用,with上下文管理器会自动完成文件资源的释放,不需要手动关闭
  • 给文件打开操作加上newline=''参数,是CSV写入的标准配置,可避免系统自动换行导致的CSV空行问题
  • 增加encoding='utf-8'参数,解决中文、特殊字符写入时的乱码问题
  • 该方案无需硬编码多实例变量,循环遍历URL列表时自动完成实例隔离,和手动逐个实例化的效果无差异

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 07:54:05