Scrape LinkedIn profile data (name, current company, country, work history, industry) filtered by company, country, and industry. Uses Playwright MCP browser automation.
npx claudepluginhub yennanliu/linkedin-skill --plugin linkedin-job-auto-applyThis skill uses the workspace's default tool permissions.
Search LinkedIn people by **company**, **country**, and/or **industry**, then extract structured profile data for each result.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Search LinkedIn people by company, country, and/or industry, then extract structured profile data for each result.
This skill is backed by three specialist agents. Invoke them for deeper help:
| Agent | File | When to Use |
|---|---|---|
| Automation Agent | skills/agents/automation-agent/SKILL.md | Timing strategy, retry logic, rate limiting |
| Web Structure Agent | skills/agents/web-structure-agent/SKILL.md | Broken selectors, missing fields, lazy load fixes |
| QA Agent | skills/agents/qa-agent/SKILL.md | Validate scraped data, completeness reports |
1. QA Agent → preFlightCheck(page) # must PASS — abort if it fails
2. [run batch scrape]
3. QA Agent → validateBatchResults() # completeness scoring
4. QA Agent → generateReport() # PASS/WARN/FAIL summary
Escalation:
The scraper builds a keyword query by joining company + country + industry as plain text. LinkedIn's people search does not parse this as structured filters — it treats everything as keywords.
For structured filtering (e.g., company by URN, geo by URN), LinkedIn's search API requires internal IDs not exposed in the UI. The most reliable workaround is to:
facetCurrentCompany, facetGeoRegion, etc.)Ask the Web Structure Agent for current URN lookup patterns if you need fully structured URL construction.
| Field | Description |
|---|---|
name | Full name |
headline | Professional headline |
location | Current country / city |
currentCompany | Most recent employer |
currentTitle | Current job title |
industry | Industry label |
workHistory | Array of { title, company, dateRange, location } |
profileUrl | LinkedIn profile URL |
scrapeLinkedInProfiles.js — batch scraper: searches by filters, visits each profile, returns array of profilesscrapeSingleProfile.js — scrape one profile by URL// Paste scrapeSingleProfile.js first, then:
const profile = await scrapeSingleProfile(page, 'https://www.linkedin.com/in/username/');
console.log(JSON.stringify(profile, null, 2));
// Paste scrapeLinkedInProfiles.js first, then:
// Example 1: engineers at Google in the US
const results = await scrapeLinkedInProfiles(page, {
company: 'Google',
country: 'United States',
industry: 'Software Development',
maxProfiles: 20
});
// Example 2: finance professionals in Singapore
const results = await scrapeLinkedInProfiles(page, {
industry: 'Financial Services',
country: 'Singapore',
maxProfiles: 15
});
// Example 3: keyword search
const results = await scrapeLinkedInProfiles(page, {
keywords: 'machine learning',
company: 'OpenAI',
maxProfiles: 10
});
console.log(JSON.stringify(results, null, 2));
| Option | Default | Description |
|---|---|---|
company | '' | Target company name |
country | '' | Target country |
industry | '' | Target industry |
keywords | '' | Additional search keywords |
maxProfiles | 10 | Max profiles to scrape |
maxPages | 5 | Max search result pages to scan |
delayMin | 2000 | Min delay between requests (ms) |
delayMax | 4000 | Max delay between requests (ms) |
[
{
"status": "success",
"name": "Jane Smith",
"headline": "Senior Software Engineer at Google",
"location": "San Francisco, California",
"currentCompany": "Google",
"currentTitle": "Senior Software Engineer",
"industry": "Software Development",
"workHistory": [
{
"title": "Senior Software Engineer",
"company": "Google",
"dateRange": "Jan 2021 – Present · 3 yrs",
"location": "San Francisco, CA"
},
{
"title": "Software Engineer",
"company": "Meta",
"dateRange": "Jun 2018 – Dec 2020 · 2 yrs 6 mos",
"location": "Menlo Park, CA"
}
],
"profileUrl": "https://www.linkedin.com/in/janesmith/"
}
]
const p = await scrapeSingleProfile(page, 'https://www.linkedin.com/in/satyanadella/');
console.log(p.name, p.currentCompany, p.location);
copy(JSON.stringify(results, null, 2)); // copies to clipboard in browser console
maxProfiles ≤ 50 per sessionEmpty workHistory: LinkedIn lazy-loads experience sections. The script scrolls to trigger them, but if the page is slow, increase delayMin to 3000.
name is null: LinkedIn may show a login wall. Ensure you are logged in before running.
No profiles found in search: Try broader keywords or remove some filters. LinkedIn search ranking can be unpredictable.