sanskar-malviya/LinkedIn-Profile-Data-Extractor
GitHub: sanskar-malviya/LinkedIn-Profile-Data-Extractor
这是一个基于Python和Playwright的自动化工具,能够模拟真实用户登录LinkedIn,抓取个人资料及公司详情,并输出结构化的JSON和CSV数据。
Stars: 1 | Forks: 0
# LinkedIn 个人资料与公司数据提取器
一个基于 Playwright 构建的稳健、全自动化 Python LinkedIn 抓取工具。它可以登录 LinkedIn,处理双重验证(2FA)和延迟加载内容,并将详细的个人资料和公司信息提取为结构化的 JSON 和 CSV 格式。
## 功能特性
### 个人资料抓取
- **类人身份验证**:模拟输入延迟,通过 Playwright 原生登录,并在本地缓存会话(`session.json`)以避免重复的 2FA 验证。
- **智能滚动**:逐步滚动 LinkedIn 的虚拟化 DOM 容器(``)以触发延迟加载的部分,并在每个部分进入视口时提取数据。
- **全面的数据提取**:
- **基本信息**:姓名、 headline、所在地、人脉数、关注者数。
- **关于**:完整的简介文本。
- **经历**:带有公司名称(支持分组角色)、时长和描述的工作经历。
- **教育背景**:学校、学位、研究领域和年份。
- **技能与认证**:已验证的技能和认证详情。
- **项目**:描述和时间线。
- **联系信息**:打开联系信息弹窗以提取邮箱、电话、生日、建立联系日期、网站和社交链接。
- **公司链接**:从经历部分提取 LinkedIn 公司网址。
### 公司抓取
- **自动检测**:传入 `/company/` 网址,抓取工具会自动切换到公司提取模式。
- **关于页面**:名称、标语、行业、规模、总部、成立年份、类型、 specialties、网站、**电话**、**邮箱**、完整**地址**、认证状态、关注者数和相关成员数。
- **职位页面**:详细的职位列表,包含职位名称、地点和发布日期 —— 支持跨所有页面分页。
- **人员页面**:员工目录,包含姓名、职位和资料网址 —— 点击“显示更多结果”并分页浏览所有页面以获取最多的员工信息。
### 通用功能
- **会话缓存**:将登录 Cookie 保存到 `session.json`。首次登录后,后续运行将完全跳过登录界面。
- **双重输出(.json & .csv)**:经过 Pydantic 验证的 JSON 和扁平化的 CSV(用于导入电子表格)。
- **双重执行模式**:直接在 `main.py` 中编辑配置或传递 CLI 参数。
## 前置条件
- Python 3.9+
- 通过 Playwright 安装的 Chrome 或 Chromium 浏览器
## 安装说明
1. 克隆仓库:
git clone https://github.com/sanskar-malviya/LinkedIn-Profile-Data-Extractor.git
cd LinkedIn-Profile-Data-Extractor
2. 创建并激活虚拟环境:
python -m venv venv
# Windows
.\venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
3. 安装依赖项:
pip install -r requirements.txt
playwright install chromium
4. 设置凭据:
cp .env.example .env
# 打开 .env 并添加你的 LINKEDIN_USERNAME 和 LINKEDIN_PASSWORD
## 使用方法
### 方法 1:编辑 `main.py` 配置块
```
# ⚙️ CONFIG BLOCK ⚙️
CONFIG_URLS = []
CONFIG_CSV = "profiles.csv"
CONFIG_MODE = "fast"
```
然后运行:
```
python main.py
```
### 方法 2:CLI 参数
**单个个人资料:**
```
python main.py --url linkedin.com/in/sanskar-malviya
```
**单个公司:**
```
python main.py --url "https://www.linkedin.com/company/anaxee-digital-runners-private-limited"
```
**通过 CSV 传递多个网址**(混合个人资料和公司):
```
python main.py --csv profiles.csv
```
**无头模式(Headless):**
```
python main.py --csv profiles.csv --headless
```
抓取工具会自动检测每个网址是人员(`/in/`)还是公司(`/company/`),并相应地进行提取。
### CLI 选项
| 标志 | 描述 |
|------|-------------|
| `--url` | 要抓取的单个 LinkedIn 网址 |
| `--csv` | 包含网址的 CSV 文件(每行一个) |
| `--username` | LinkedIn 邮箱(覆盖 `.env` 中的设置) |
| `--password` | LinkedIn 密码(覆盖 `.env` 中的设置) |
| `--headless` | 在无 UI 模式下运行浏览器 |
| `--mode` | `fast` 或 `stealth`(类人延迟) |
| `--proxy` | 代理网址(`http://user:pass@host:port`) |
## 输出结果
### 文件
- **`output_raw.json`** — 结构化的、经过 Pydantic 验证的 JSON。
- **`output_raw.csv`** — 用于 Excel/Airtable 的扁平化 CSV。
### 个人资料 JSON Schema
```
{
"profile_url": "https://linkedin.com/in/sanskar-malviya",
"basic": {
"full_name": "Sanskar Malviya",
"headline": "Data Analyst | AI Engineer | ...",
"location": "Indore, Madhya Pradesh, India",
"connection_count": 500,
"follower_count": 1142
},
"about": "I am a Computer Science Engineer...",
"experience": [
{
"company": "Anaxee Digital Runners Private Limited",
"role": "Data Analyst",
"duration": "Jul 2024 - Present · 1 yr 10 mos"
}
],
"education": [...],
"skills": [{"name": "Python"}, ...],
"contact_info": {
"email": "example@gmail.com",
"phone": null,
"websites": ["https://portfolio.com"],
"birthday": "May 17",
"connected_at": "Oct 27, 2025"
},
"company_links": ["https://www.linkedin.com/company/anaxee-digital-runners-private-limited"]
}
```
### 公司 JSON Schema
```
{
"company_url": "https://www.linkedin.com/company/anaxee-digital-runners-private-limited",
"name": "Anaxee Digital Runners Private Limited",
"tagline": "India's Reach Engine!",
"industry": "Environmental Services",
"company_size": "51-200 employees",
"headquarters": "Indore, Madhya Pradesh",
"founded": "2016",
"website": "https://www.anaxee.com/",
"phone": "9584132577",
"email": "sales@anaxee.com",
"address": "303, Right-wing, New IT Park Building 3rd floor, ..., Indore, MP 452003",
"follower_count": 11000,
"employee_count_on_linkedin": "247 associated members",
"verified": "March 22, 2025",
"jobs": [
{"title": "Management Trainee || April 2026", "location": "Indore", "posted": "2 weeks ago"}
],
"employees": [
{"name": "Devesh Chouksey", "title": "Business Development Executive @Anaxee", "profile_url": "https://..."}
]
}
```
## 项目结构
```
LinkedIn-Profile-Data-Extractor/
├── main.py # Entry point, CLI, orchestration
├── scraper/
│ ├── extractor.py # Profile extraction (live DOM + scrolling)
│ ├── company_extractor.py # Company extraction (about/jobs/people)
│ ├── auth.py # Login, session management, 2FA handling
│ ├── browser.py # Playwright browser setup
│ ├── models.py # Pydantic data models
│ └── utils.py # Delays, scrolling helpers
├── profiles.csv # Input URLs
├── output_raw.json # Generated JSON output
├── output_raw.csv # Generated CSV output
├── session.json # Cached login session
├── .env # Credentials (not committed)
└── requirements.txt # Python dependencies
```
## 故障排除
- **双重验证 / 检查点**:首次运行时,如果 LinkedIn 要求输入验证码,Playwright 窗口将暂停,等待你手动输入。会话将保存到 `session.json` —— 在会话过期之前,你将不再需要 2FA。
- **字段为空**:LinkedIn 经常更改其 DOM 结构。如果字段返回 `null`,可能需要更新 `extractor.py` 中的 CSS 选择器。
- **有 247 位成员但仅提取了 181 位**:LinkedIn 会根据你的人脉度数限制员工可见性。三度及以上(3rd+ degree)的资料可能不会显示。
- **日志**:详细的执行日志会写入 `execution.log`。
## 免责声明
直接抓取 LinkedIn 可能违反其服务条款。此工具仅供教育目的使用。请谨慎处理凭据并遵守速率限制,以避免账户被暂停。
标签:2FA, BeEF, CSV, Headless, JSON, LinkedIn, Playwright, Python, URL抓取, 代码示例, 企业信息, 会话保持, 反爬虫, 后端开发, 懒加载, 招聘信息, 数据分析, 数据抓取, 无后门, 浏览器自动化, 爬虫, 特征检测, 用户画像, 社交网络, 结构化数据, 网络调试, 自动化, 逆向工具