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
相关产品推荐
相关产品推荐

