关于 linkedin-scraper
利用已登录的 Chrome 浏览器会话抓取 LinkedIn 个人资料、搜索结果和公司页面。适合需要结构化联系人或公司信息的浏览与研究流程,并提供速率限制和数据处理指引。
主要功能
- 01抓取个人资料与搜索结果
- 02提取公司页面和员工列表
- 03输出结构化 JSON
- 04可选存储到 DuckDB
- 05提供速率限制与错误处理规则
适用场景
- 01整理 LinkedIn 搜索结果中的潜在联系人
- 02汇总个人资料中的职位、经历和教育信息
- 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_title | Experience 部分的第一项 | 最近的职位 |
| current_company | Experience 部分的第一项 | 公司名称 |
| education | Education 部分 | 学校、学位、日期 |
| connections | 联系人数 | 数字或“500+” |
| about | About 部分 | 简介文本(可能需要点击“see more”) |
| experience | Experience 部分 | 所有职位及日期 |
| 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
¤tCompany=%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