TL;DR
LinkedIn 抓取是自动化提取 LinkedIn 页面信息,但工程要求通常是更具体的:关于你自己的活动、管理的组织或已批准集成的可用数据集。在选择浏览器扩展或编写选择器之前,先明确该要求。"某个行业中的所有个人资料"和"我自己的导出联系人"是根本不同的访问和质量问题。
LinkedIn 的 用户协议 限制了抓取和某些自动化使用。将平台权限视为项目前提条件,而不是浏览器配置设置。可见页面或工作会话并不能证明收集方法或下游使用是被允许的。本指南专注于已批准的来源和离线处理,而不是绕过访问限制的配方。
使用源矩阵来防止针对不合适的端点进行昂贵的实现。指定实体、字段、授权账户、更新频率和允许的使用。如果没有任何已批准的来源提供所需字段,请记录该缺口,而不是从姓名或职位推断。
LinkedIn 的 数据下载说明 描述了从“设置与隐私”中请求存档,然后在“数据隐私”中下载数据。这是一个账户数据导出,而不是其他成员的无限制目录。可用类别取决于你的账户活动,且由于成员的隐私选择,联系人电子邮件地址可能缺失。
对于一次性个人存档或授权迁移,此方法可能比从页面标记重建数据集更合适。保留原始文件、导出日期和所选类别。在将其加载到 CRM 之前确认每列的含义;空白电子邮件不是解析器指令来猜测一个。
LinkedIn 的 API 访问指南 区分了开放权限和需要批准的程序。认证和同意是访问的必要部分,它们不是检索任何成员完整个人资料的授权。在设计数据合同之前,请检查具体产品、权限、实体和允许的使用。
将登录、组织管理、广告和销售相关的集成需求分开。一个对某个产品有效的令牌仍可能缺乏对不同资源的权限。记录操作和错误类别,但不要记录令牌本身。本文未执行任何经过认证的 LinkedIn API 请求。
浏览器提取依赖于加载的页面、账户角色、当前布局和导航状态。如果你的组织有明确授权的有限工作流,请在自动化之前定义页面和字段。当目标请求不同权限或显示限制时停止。新的浏览器配置文件不会扩大批准的数据集。
有用的记录应包含 source_record_id(如果提供)、source_url、observed_at、source_type、name、company 和字段级质量状态。不要仅使用显示名称作为唯一标识符:不同的人可能共享一个名称,而一个人可能更改名称或雇主。保留原始值并记录标准化决策,以便可以撤销错误的合并。
| 数据条件 | 存储选择 | 为什么重要 |
|---|---|---|
| 缺失的个人资料 URL | 隔离或保留为未匹配 | 基于名称的合并可能组合不同的人 |
| 缺失的电子邮件 | 如果已知原因则设为 null | 不等同于无效或猜测的地址 |
| 重复的源 URL | 调查精确重复或新快照 | 后续观察可能包含真实更新 |
| 冲突的雇主 | 保留来源和时间 | 需要时效性和上下文来解决 |
以下 Python 示例使用了故意简化、合成的 CSV。其列是教学合同,而不是对当前存档确切标题的承诺。它使用 Python 的 CSV 解析器 而不是按逗号分割行,这会错误处理带引号的名称或公司值。
import csv, io, json
from urllib.parse import urlsplit, urlunsplit
sample = 'name,url,company\n"Demo, Person",https://www.linkedin.com/in/demo/?trk=x,Example\n"Demo, Person",https://www.linkedin.com/in/demo/,Example\nUnmatched,,Example\n'
seen, accepted, rejected = set(), [], []
for row in csv.DictReader(io.StringIO(sample)):
parts = urlsplit(row["url"].strip())
if (parts.scheme != "https" or parts.netloc.lower() != "www.linkedin.com"
or not parts.path.startswith("/in/")):
rejected.append({"name": row["name"], "reason": "missing_or_unexpected_url"})
continue
key = urlunsplit(("https", "www.linkedin.com", parts.path.rstrip("/") + "/", "", ""))
if key in seen:
continue
seen.add(key)
accepted.append({"name": row["name"], "source_url": key, "company": row["company"]})
assert len(accepted) == 1 and len(rejected) == 1
print(json.dumps({"accepted": accepted, "rejected": rejected}, indent=2))
本地运行保留了一个标准化记录,删除了重复的 URL,并分离了没有 URL 的行。它没有进行网络请求,也没有处理真实个人数据。此狭窄的标准化器仅接受声明的主机和路径;当你的批准数据集合法使用其他 URL 形式时,适配显式允许列表。不要静默扩大它以适应任意重定向。
对于真实文件,检查任何前导行和标题拼写,然后有意识地配置解析器。保持计数核对:输入行等于接受、重复和拒绝的行。存储转换版本并避免覆盖唯一源副本。
Nstbrowser 将浏览器环境组织为单独的配置文件。这可以帮助团队将允许的审查任务与预期的账户上下文关联。其组设置包括影响保存状态处理的存储和同步选择。这些控制在准备或审查授权账户工作流时很有用。它们不会授权 LinkedIn 抓取,扩展 API 权限或保证账户避免限制。
按照 配置文件创建流程,然后查看 组存储设置。如果一个允许的内部流程需要可重复的浏览器操作,请在定义其允许范围后咨询 RPA 文档。本指南中未执行任何实时 LinkedIn 浏览器提取或 Nstbrowser 工作流。
保持接受标准具体:正确账户、请求的存档、预期文件类别和核对行数。一个打开正确页面的工具仅完成了任务的浏览器部分。
Q: LinkedIn API 访问是否允许我下载每个个人资料?
否。访问与特定产品、权限和批准的使用相关。请审查你实际需要的操作。
Q: 为什么连接导出中的电子邮件字段缺失?
LinkedIn 表示连接电子邮件的可用性部分取决于成员的隐私选择。请保留缺失值,而不是猜测它们。
Q: 浏览器配置文件是否能让抓取合法?
否。环境管理和平台授权是独立的要求。
Q: 仅通过姓名匹配是否足以去重?
否。在可用时使用稳定来源标识符,并保留模糊记录以供审查。