mcpField
L
linkedin-scraper

linkedin-scraper

github.com/aspenas营销与增长113 次安装
代码仓库

关于 linkedin-scraper

利用已登录的 Chrome 浏览器会话抓取 LinkedIn 个人资料、搜索结果和公司页面。适合需要结构化联系人或公司信息的浏览与研究流程,并提供速率限制和数据处理指引。

主要功能

  1. 01抓取个人资料与搜索结果
  2. 02提取公司页面和员工列表
  3. 03输出结构化 JSON
  4. 04可选存储到 DuckDB
  5. 05提供速率限制与错误处理规则

适用场景

  1. 01整理 LinkedIn 搜索结果中的潜在联系人
  2. 02汇总个人资料中的职位、经历和教育信息
  3. 03收集公司页面资料及员工列表

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/aspenas/ironclaw-skills --skill linkedin-scraper

安装后在 Claude Code 中输入/linkedin-scraper确认已加载。

详细介绍

LinkedIn 抓取工具 — Chrome 配置文件网页抓取

使用用户已登录的 Chrome 浏览器会话抓取 LinkedIn 个人资料和搜索结果。无需 API 密钥 — 使用带有 Chrome 配置文件中继的浏览器工具。

前提条件

  • 已登录 LinkedIn 的 Chrome 浏览器
  • 已连接浏览器中继(Chrome 扩展或 openclaw browser profile)
  • 用于存储结果的 DuckDB 工作区(可选)

核心工作流

1. 抓取单个个人资料
browser → open LinkedIn profile URL
browser → snapshot (extract structured data)
→ Parse: name, headline, title, company, location, education, experience, connections, about
→ Return structured JSON or insert into DuckDB
2. 搜索 + 批量抓取
browser → open LinkedIn search URL with filters
browser → snapshot (extract result cards)
→ Parse each result: name, title, company, profile URL
→ For each profile URL: open → snapshot → parse full profile
→ Batch insert into DuckDB
3. 抓取公司主页
browser → open LinkedIn company page
→ Parse: company name, industry, size, description, specialties, employee count
→ Navigate to /people tab for employee list

实施规则

速率限制(重要)
  • 页面加载之间至少延迟 3-5 秒
  • 每个会话最多抓取 80 个个人资料(LinkedIn 速率限制)
  • 将延迟随机设置为 3-8 秒(避免被检测)
  • 每抓取 20 个个人资料后,休息 60 秒
  • 如果检测到 CAPTCHA 或“异常活动”,立即停止并提醒用户
隐蔽操作模式
  • 自然滚动(缓慢向下滚动、暂停,然后继续滚动)
  • 同一搜索结果页面抓取次数不要超过两次
  • 调整访问个人资料的顺序(不要按顺序逐个访问)
  • 定期关闭并重新打开标签页
数据提取 — 个人资料页面

从 LinkedIn 个人资料快照中提取以下字段:

字段位置备注
name主标题 h1全名
headline姓名下方通常为职位 + 公司
location位置部分城市、州/国家
current_titleExperience 部分的第一项最近的职位
current_companyExperience 部分的第一项公司名称
educationEducation 部分学校、学位、日期
connections联系人数数字或“500+”
aboutAbout 部分简介文本(可能需要点击“see more”)
experienceExperience 部分所有职位及日期
profile_url浏览器地址栏规范的 LinkedIn URL
数据提取 — 搜索结果

从 LinkedIn 搜索结果页面中提取:

字段位置
name结果卡片标题
headline卡片中姓名下方
location卡片元数据
profile_url姓名上的链接 href
mutual_connections卡片页脚

搜索 URL 模式

# People search
https://www.linkedin.com/search/results/people/?keywords={query}

# With filters
&geoUrn=%5B%22103644278%22%5D          # United States
&network=%5B%22F%22%2C%22S%22%5D        # 1st + 2nd connections
&currentCompany=%5B%22{company_id}%22%5D # Current company
&schoolFilter=%5B%22{school_id}%22%5D    # School filter

# YC founders (common query)
https://www.linkedin.com/search/results/people/?keywords=Y%20Combinator%20founder

# Company employees
https://www.linkedin.com/company/{slug}/people/

DuckDB 集成

存储到 DuckDB 时,使用 Ironclaw 工作区数据库:

-- Check if leads/contacts object exists
SELECT * FROM objects WHERE name = 'leads' OR name = 'contacts';

-- Insert via the EAV pattern or direct pivot view
INSERT INTO v_leads ("Name", "Title", "Company", "LinkedIn URL", "Location", "Source")
VALUES (?, ?, ?, ?, ?, 'LinkedIn Scrape');

如果没有合适的对象,则创建一个:

-- Use Ironclaw's object creation pattern from the dench skill

错误处理

错误操作
“Sign in”页面LinkedIn 会话已过期 — 提醒用户在 Chrome 中重新登录
CAPTCHA / 安全检查立即停止,等待 30 分钟以上,并提醒用户
“Profile not found”跳过,并将 URL 记录为无效
速率限制 (429)停止,等待 15 分钟,并延长延迟后重试
快照为空页面仍在加载 — 等待 3 秒后重新截取快照

输出格式

JSON(默认)
{
  "name": "Jane Doe",
  "headline": "CEO at Acme Corp",
  "current_title": "CEO",
  "current_company": "Acme Corp",
  "location": "San Francisco, CA",
  "linkedin_url": "https://www.linkedin.com/in/janedoe",
  "connections": "500+",
  "education": [{"school": "Stanford", "degree": "BS CS", "years": "2010-2014"}],
  "experience": [{"title": "CEO", "company": "Acme Corp", "duration": "2020-Present"}],
  "scraped_at": "2026-02-17T14:30:00Z"
}
进度报告

批量抓取时,报告进度:

Scraping: 15/50 profiles (30%) — Last: Jane Doe (Acme Corp)
Rate: ~4 profiles/min — ETA: 9 min remaining

安全

  • 绝不抓取私密/受限个人资料
  • 遵守 LinkedIn 对公开页面的 robots.txt
  • 仅在本地存储数据(DuckDB)— 绝不外传
  • 用户必须拥有合法的 LinkedIn 访问权限
  • 此工具协助用户规模化进行自己的手动浏览

评论

支持 Markdown