     [Blog](https://scrapfly.io/blog)   /  [python](https://scrapfly.io/blog/tag/python)   /  [5 Best Open-Source LinkedIn Scrapers on GitHub in 2026](https://scrapfly.io/blog/posts/best-linkedin-scrapers-github)   # 5 Best Open-Source LinkedIn Scrapers on GitHub in 2026

 by [Hisham Medhat](https://scrapfly.io/blog/author/hisham) Aug 14, 2026 19 min read [\#python](https://scrapfly.io/blog/tag/python) [\#scrapeguide](https://scrapfly.io/blog/tag/scrapeguide) 

 [  ](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github "Share on LinkedIn") [  ](https://x.com/intent/tweet?url=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github&text=5%20Best%20Open-Source%20LinkedIn%20Scrapers%20on%20GitHub%20in%202026 "Share on X") [  ](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github "Share on Facebook")    

 

 

Summarize this article with

 [  ](https://chat.openai.com/?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github) [  ](https://claude.ai/new?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github) [  ](https://x.com/i/grok?text=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github) [  ](https://www.perplexity.ai/search/new?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github) [  ](https://www.google.com/search?udm=50&aep=11&q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-linkedin-scrapers-github) 



         

Point a plain Python HTTP client at a public LinkedIn profile and LinkedIn answers with HTTP 999, its own non-standard refusal code. Public people search redirects straight to the login page. That wall, not the star count, decides which repo you can run.

Below are five repos with their real GitHub numbers read in August 2026, their auth model, and the limit each README buries. Two need no LinkedIn account. Three want a session file, and one of those has shipped nothing but README edits since 2025.

[How to Scrape LinkedIn Profiles, Companies, and Jobs in 2026LinkedIn aggressively blocks scrapers. This guide shows how to scrape profiles, companies, and jobs anyway using ScrapFly's anti-bot solution. Python code included.](https://scrapfly.io/blog/posts/how-to-scrape-linkedin)



[**Latest LinkedIn Scraper Code**github.com/scrapfly/scrapfly-scrapers/tree/main/linkedin-scraper](https://github.com/scrapfly/scrapfly-scrapers/tree/main/linkedin-scraper)

## Key Takeaways

- **Two families:** no-account repos read public pages, account repos open the rest.
- **joeyism/linkedin\_scraper leads on breadth,** 4,415 stars, but wants a session file.
- **Licenses are messy:** GPL-3.0, NPOSL-3.0 and WTFPL sit beside MIT and Apache-2.0.
- **The three-to-five profile-view wall is browser behavior,** not a stateless request cap.
- **Public jobs stay open,** while people search and employee tabs redirect to login.
- **Read the last commit's content,** because a README sponsor edit refreshes the date too.

**Get web scraping tips in your inbox**Trusted by 100K+ developers and 30K+ enterprises. Unsubscribe anytime.







## Which Open-Source LinkedIn Scraper Should You Use?

Two questions settle it. Which LinkedIn surface do you need, and will you put an account behind it?

Here are the quick picks by job:

- Profiles, companies, company posts and jobs from one library: joeyism/linkedin\_scraper
- Public pages with no LinkedIn account to lose: Scrapfly's `linkedin-scraper`
- Job listings in volume, across boards: speedyapply/JobSpy
- LinkedIn reads from an AI agent: stickerdaniel/linkedin-mcp-server
- A company's full employee roster: cullenwatson/StaffSpy

The table is the at-a-glance version. Stars and last-commit dates come from the GitHub API in August 2026. Licenses come from each repo's LICENSE file, not its README badge.

| Repo | Language | Auth model | Best data | Stars | Last commit | License |
|---|---|---|---|---|---|---|
| joeyism/linkedin\_scraper | Python (Playwright) | Login, saved session file | Profiles, companies, company posts, jobs | 4,415 | Apr 2026 | GPL-3.0 (badge says Apache 2.0) |
| Scrapfly linkedin-scraper | Python (managed fetch) | No account, `SCRAPFLY_KEY` | Profile, company, job search, job detail, articles | 1,062 (monorepo) | Feb 2026 (module) | NPOSL-3.0 |
| speedyapply/JobSpy | Python | No login, public jobs endpoint | Job listings on LinkedIn plus other boards | 4,088 | Feb 2026 | MIT |
| stickerdaniel/linkedin-mcp-server | Python (Patchright) | Login, your own browser session | 19 tools over profiles, companies, jobs, messages | 3,115 | Aug 2026 | Apache-2.0 |
| cullenwatson/StaffSpy | Python (Selenium) | Login, session file | Company employee rosters, skills, schools | 324 | Jun 2025 | WTFPL |

One naming trap before you clone anything. joeyism's PyPI package is also called `linkedin-scraper`, so that pip name gets you their library, not Scrapfly's module. Scrapfly's version ships only as a monorepo directory.

The criteria behind that ranking come next, starting with the surface each repo covers.



## How Did We Rank These LinkedIn Scrapers?

We ranked on the LinkedIn surface each repo covers today, then its auth model and the account risk that comes with it. Dated maintenance came third, read from commits and open issues.

Language fit and production readiness broke the remaining ties. A repo that returns typed models with a loud error beats one that returns half-empty dictionaries.

Every figure here is dated, because the `linkedin-scraper` GitHub topic holds 344 repos and the roster churns weekly. Stars in particular predict almost nothing, and the section on repos to avoid shows why.

Open source here means code you can read, clone and self-host. Scrapfly's own scraper is ranked on that basis. Its entry below names the non-profit license and the paid fetch layer.

Repos whose runnable code is a thin client for the maintainer's paid data API are funnels, and we do not rank funnels. This article names no such vendor.



## 1. joeyism/linkedin\_scraper: Best for Full Profile, Company, and Job Data

[joeyism/linkedin\_scraper](https://github.com/joeyism/linkedin_scraper) covers more of LinkedIn than anything else here. It is also the most-starred independent repo in the roster, at 4,415 stars and 968 forks.

Version 3 is a rewrite from Selenium to async [Playwright](https://scrapfly.io/blog/posts/web-scraping-with-playwright-and-python) with [Pydantic](https://docs.pydantic.dev/) models. The branch carrying version 3 is `master`, not `main`.

The scrapers are `PersonScraper`, `CompanyScraper`, `CompanyPostsScraper`, `JobScraper` and `JobSearchScraper`. `CompanyPostsScraper` is the unusual one, since its `Post` model carries `reactions_count`, `comments_count` and `reposts_count`.

Install is two commands, and the first one is where the naming collision bites:

bash```bash
pip install linkedin-scraper
playwright install chromium
```



That resolves to `linkedin-scraper` 3.1.2 with Playwright 1.62.0, which supports Python 3.14. The PyPI package is joeyism's library, so nothing from the [Selenium](https://scrapfly.io/blog/posts/web-scraping-with-selenium-and-python) era of the project is installed.

Every scraper needs a session first. You run `samples/create_session.py`, log in by hand in the browser it opens, and `wait_for_manual_login()` polls until a logged-in nav appears.

It then writes `linkedin_session.json`, which is raw Playwright storage state. The repo's own docstring says never to commit that file.

With the session in place, a profile pull is short. This is `samples/scrape_person.py` from `master`, cut down to the lines that matter:

python```python
import asyncio
from linkedin_scraper.core.browser import BrowserManager
from linkedin_scraper.scrapers.person import PersonScraper

async def main():
    async with BrowserManager(headless=True) as browser:
        await browser.load_session("linkedin_session.json")
        scraper = PersonScraper(browser.page)
        person = await scraper.scrape("https://www.linkedin.com/in/williamhgates/")
        print(f"Name: {person.name}")
        print(f"Location: {person.location}")
        print(f"Experiences: {len(person.experiences)}")
        print(f"Education: {len(person.educations)}")

asyncio.run(main())
```



We ran that with a session file carrying no auth cookies, and the failure is the useful part:

text```text
ScrapingError: Failed to scrape person profile: Not logged in. Please authenticate before scraping.
browser ended on: https://www.linkedin.com/authwall?trk=bf&sessionRedirect=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fwilliamhgates%2F
```



The library raised a `ScrapingError` and the browser landed on LinkedIn's authwall. Loud failure is the behavior you want, since silent blanks poison a dataset for weeks.

The README badge and the PyPI metadata both claim Apache 2.0. The LICENSE file is copyleft GPL-3.0, and that contradiction matters if you embed the code in a product.

Version 3 is not backwards compatible with version 2, and the README's own fallback is `pip install linkedin-scraper==2.11.2`. Issue #291, open since May 2026, reports many extracted fields coming back as `None`.

So joeyism/linkedin\_scraper fits when you need broad coverage and can spend a throwaway account on it.



## 2. Scrapfly linkedin-scraper: Best for Public Data Without an Account or a Ban

Scrapfly's [linkedin-scraper](https://github.com/scrapfly/scrapfly-scrapers/tree/main/linkedin-scraper) reads public LinkedIn pages with no LinkedIn login at all. That means there is no account for LinkedIn to restrict. It ships as a directory inside the `scrapfly-scrapers` monorepo, which carries 1,062 stars and 202 forks.

Five async functions cover five surfaces. `scrape_profile`, `scrape_company`, `scrape_jobs` and `scrape_articles` parse the page's `application/ld+json` block instead of chasing CSS classes, and `scrape_job_search` walks the paginated results endpoint.

The credential it wants is `SCRAPFLY_KEY`, read at import time, so a missing key raises `KeyError` on `import linkedin` before any request goes out:

bash```bash
git clone https://github.com/scrapfly/scrapfly-scrapers.git
cd scrapfly-scrapers/linkedin-scraper
export SCRAPFLY_KEY="YOUR_SCRAPFLY_KEY"
poetry install
```



[Poetry](https://python-poetry.org/) installs the module's own dependencies, and Python 3.10 or newer is required. Save the following as `quickstart.py` next to `linkedin.py`:

python```python
# quickstart.py, saved next to linkedin.py
import asyncio
import linkedin

# linkedin.py ships this config and every scrape function reuses it:
# BASE_CONFIG = {
#     "asp": True,
#     "country": "US",
#     "headers": {"Accept-Language": "en-US,en;q=0.5"},
#     "render_js": True,
#     "proxy_pool": "public_residential_pool",
# }

async def main():
    profiles = await linkedin.scrape_profile(
        urls=["https://www.linkedin.com/in/williamhgates"]
    )
    profile = profiles[0]["profile"]
    print("name:     ", profile["name"])
    print("jobTitle: ", ", ".join(profile["jobTitle"]))
    print("location: ", profile["address"]["addressLocality"])
    print("alumniOf: ", len(profile["alumniOf"]), "entries")

asyncio.run(main())
```



Running `poetry run python quickstart.py` in August 2026 printed this, with no LinkedIn account anywhere in the flow:

text```text
2026-08-06 17:24:29.010 | SUCCESS | linkedin:scrape_profile:62 - scraped 1 profiles from Linkedin
name:      Bill Gates
jobTitle:  Co-chair, Founder, Co-founder
location:  Seattle, Washington, United States
alumniOf:  1 entries
```



The `@graph` Person node gave up name, a three-item `jobTitle` list, a `PostalAddress` and `alumniOf` in one request. The blocking work lives in `BASE_CONFIG`, and you set those flags once.

The monorepo last pushed in August 2026, but the `linkedin-scraper` directory itself last changed in February 2026. Treat February as the module's real date.

The license is NPOSL-3.0, a non-profit open-source license rather than MIT. `pyproject.toml` also pins `scrapfly-sdk ^0.8.5` while the current SDK release is 0.11.1.

Reach for it when the data you need is public and you would rather keep a LinkedIn account out of the loop entirely.



## 3. speedyapply/JobSpy: Best for LinkedIn Job Listings at Scale

[JobSpy](https://github.com/speedyapply/JobSpy) does jobs and nothing else. One call returns LinkedIn, Indeed, Glassdoor, Google, ZipRecruiter, Bayt and bdjobs postings in a single [pandas](https://pandas.pydata.org/) dataframe.

It needs no LinkedIn account because LinkedIn's guest jobs surface is genuinely open. The [hidden endpoint](https://scrapfly.io/blog/posts/how-to-scrape-hidden-apis) behind it, `/jobs-guest/jobs/api/seeMoreJobPostings/search`, answered 13 consecutive paginated requests with status 200 for us in August 2026.

Install from git rather than PyPI. Release 1.1.82 dates to July 2025 and hard-pins `numpy==1.26.3`, which does not import on Python 3.14:

bash```bash
pip install git+https://github.com/speedyapply/JobSpy.git
```



The repo's own `pyproject.toml` relaxes that pin to `numpy>=1.26.0`, so the git build installs cleanly on current Python. Import is `jobspy` even though the package name is `python-jobspy`.

python```python
from jobspy import scrape_jobs

jobs = scrape_jobs(
    site_name=["linkedin"],
    search_term="data engineer",
    location="New York, NY",
    results_wanted=20,
)

print(f"rows: {len(jobs)}, columns: {len(jobs.columns)}")
print(jobs[["site", "title", "company", "location", "date_posted"]].head(5).to_string())
```



That ran from one residential IP with no account, no cookie and no proxy:

text```text
rows: 20, columns: 34
       site                                                               title                    company         location date_posted
0  linkedin  Data Engineer II - Digital and Technology Partners - Hybrid/Remote    Mount Sinai Morningside     New York, NY  2026-08-14
1  linkedin  Data Engineer II - Digital and Technology Partners - Hybrid/Remote  Mount Sinai Health System     New York, NY  2026-08-14
2  linkedin                                                    Data Engineer II                    MetLife  Bridgewater, NJ  2026-08-13
3  linkedin                                                       Data Engineer           Hearts & Science     New York, NY  2026-08-13
4  linkedin                                                       Data Engineer                  Cognition                   2026-08-12
```



Twenty rows and 34 columns, with `date_posted` parsed into real ISO dates. Add `site_name=["linkedin", "indeed"]` and both boards come back in the same frame, which no other entry here does.

The maintainers state two limits themselves. The README says "All the job board endpoints are capped at around 1000 jobs on a given search".

On rate limits it adds that "LinkedIn is the most restrictive and usually rate limits around the 10th page with one ip. Proxies are a must basically."

We confirmed the cap exactly. Offset 975 returned 200 with 10 cards, and offset 1000 returned HTTP 400. We did not trigger the rate limit, so treat it as the maintainers' claim.

One more limit the parameter list hides: a LinkedIn search takes only one of `hours_old` or `easy_apply`, and the README notes the `easy_apply` filter no longer works.

Eight LinkedIn-specific issues are open against a February 2026 last commit. Issue #374 reports empty job descriptions and #370 reports a missing `job_url_direct`, and both hit the `linkedin_fetch_description` path.

Jobs are the ceiling here, so profiles and companies need a different repo. The next one puts LinkedIn behind an agent's tool calls.



## 4. stickerdaniel/linkedin-mcp-server: Best for LinkedIn Access From AI Agents

[linkedin-mcp-server](https://github.com/stickerdaniel/linkedin-mcp-server) exposes LinkedIn as tools an agent can call. It speaks [MCP](https://scrapfly.io/blog/posts/what-is-mcp-understanding-the-model-context-protocol), so a client reads profiles and jobs inside a wider task.

This is the freshest repo in the roster by a wide margin. Commits landed in August 2026, and another is already open in a pull request.

Nine PyPI releases shipped in the last 60 days, and the repo carries 3,115 stars and 538 forks under Apache-2.0.

It controls a real Chromium through [Patchright](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright-python), a stealth Playwright fork, using your own logged-in session. Its dependency list carries no LinkedIn API client, so nothing here talks to an unofficial API.

The install name is the first thing to get right. The published package is `mcp-server-linkedin`, launched as `uvx mcp-server-linkedin@latest`, and the PyPI project named `linkedin-mcp-server` belongs to an unrelated author.

Nineteen tools ship today, and they go well past reading. `send_message` and `connect_with_person` write to LinkedIn on your behalf, which raises the stakes above anything else in this roster.

We rank it for the read tools only. Automating messages and connection requests is outreach automation rather than data collection, and it is the fastest way to lose the account.

The README is blunt about that. It says LinkedIn's User Agreement "prohibits automated access, and accounts using automated tools can be restricted or banned."

The README flags several tools with an open issue link, including `get_person_profile`, the headline feature. `search_people` and both write tools are in the same state.

Use it when an agent workflow needs LinkedIn context and you accept the session risk.



Scrapfly

#### Scale your web scraping effortlessly

Scrapfly handles proxies, browsers, and anti-bot bypass — so you can focus on data.

[Try Free →](https://scrapfly.io/register)## 5. cullenwatson/StaffSpy: Best for Company Employee and Staff Rosters

[StaffSpy](https://github.com/cullenwatson/StaffSpy) points at a company and returns its people, which the four repos above skip. `LinkedInAccount` exposes `scrape_staff`, `scrape_users`, `scrape_comments`, `scrape_companies` and `scrape_connections`.

It is also the riskiest and stalest entry, and it earns fifth place on both counts.

The mechanism is LinkedIn's internal Voyager API, hit directly at `voyagerIdentityDashProfiles`. That is the highest-exposure surface in the roster, and the required dependency block includes a paid CAPTCHA-solving service.

Nothing has shipped since June 2025, and that commit was a README edit. Two issues report LinkedIn-side breakage and remain open, #75 on the API changing and #76 on `scrape_users` returning 410.

The `potential_email` column deserves care. StaffSpy builds those addresses by permuting a name and a domain, so they are guesses, not scraped facts.

The optional `block=True` and `connect=True` flags change your own account state, and the session file is documented to last "a week or so." StaffSpy is 324 stars under WTFPL, so verify it against LinkedIn's current responses before you build on it.



## Should You Scrape Logged Out or Log In? (The Honest Trade-off)

Logged out, nothing of yours can be banned, but LinkedIn hides most of itself. Logged in, the full surface opens and your account carries the risk instead of your code.

The wall is real and easy to observe. In August 2026, public people search at `/search/results/people/?keywords=engineer` answered 307 to `/uas/login`, and a company's `/people/` employee tab answered 302 to the same place.

That is why StaffSpy and `get_company_employees` both need an account. The employee-roster surface is gated at the HTTP level, not behind a modal.

Public profiles and public jobs are a different story. A profile page still returns one `application/ld+json` block anonymously, and the guest jobs endpoint paged happily while the same IP was refusing profile requests.

The often-quoted "three to five profile views" figure needs a caveat. It describes an anonymous visitor meeting a sign-in prompt in a browser, not a rate ceiling on a stateless client.

Twenty-four cookieless requests to one public profile returned 23 responses with status 200 and a single 999 for us. The ceiling is not a per-session view counter.

What did shut the door was volume from one address. After roughly 50 to 60 anonymous profile requests inside 15 minutes, that IP moved to 999 on every request, cookieless or not.

Use a dedicated throwaway account for anything authenticated, never your main one. Keep the session file out of version control, because it authenticates as you.

Then pace requests, and spread them across addresses rather than hammering one. If neither path fits, Scrapfly's Web Scraping API reads the public pages without an account at all.

[11 Best Web Scraping APIs, Libraries, and Crawlers for Developers in 2026Compare the best web scraping tools in 2026. Pipeline-based guide covering Scrapfly, BeautifulSoup, Playwright, Scrapy, and more for production scraping.](https://scrapfly.io/blog/posts/best-web-scraping-apis)



## Which LinkedIn Scraper Repos Should You Avoid?

Three categories waste your time, and all three rank well on stars. Stale repos, READMEs that exist to sell an API, and OSINT tools that never touch LinkedIn.

The dated evidence, all read in August 2026:

- **Stale high-star repos.** josephlimtech/linkedin-profile-scraper-api holds 772 stars and last pushed in April 2024. linkedtales/scrapedin holds 612 stars, last pushed in February 2023, and its npm package last published in July 2020. Its README still advertises that it works "in 2020".
- **Paid-API READMEs.** josephlimtech's README puts a commercial-alternative section above its own getting-started docs. The API it promotes shut down on July 4, 2025, after LinkedIn sued it in January 2025, and LinkedIn announced the resolution later that month. The link still resolves, but it lands on a "no longer in service" notice that forwards to the founder's next paid product, so the README is still a funnel.
- **OSINT and enumeration tools.** m8sec/CrossLinked has 1,580 stars and is the fourth most-starred repo on the `linkedin-scraper` topic, yet it scrapes search engines for employee names and never touches LinkedIn. 0xZDH/BridgeKeeper, 130 stars and last pushed in 2022, is an OSINT username-generation tool.

A sponsor block on its own is not disqualifying, and entry #4 above proves it. That repo carries a paid-vendor banner and still ships commits weekly, so the test is whether the runnable code stands without the vendor.

The last-commit date needs the same skepticism. spinlud/py-linkedin-jobs-scraper last committed on August 10, 2026, which reads fresh until you open it. That commit added two HTML id attributes to the sponsor logo in the README, changed a pre-commit hook and bumped the version string. The date moved and the scraper did not.

Read what the commit did, then skim the open issues. That is where JobSpy's empty descriptions and joeyism's `None` fields surfaced, months before either repo's date looked stale.

[5 Best Open-Source Facebook Marketplace Scrapers on GitHub in 2026A dated, freshness-first roundup of the open-source Facebook Marketplace scrapers on GitHub worth cloning in 2026, and the dead repos to skip.](https://scrapfly.io/blog/posts/best-facebook-marketplace-scrapers-github)



## Why Open-Source LinkedIn Scrapers Break (and How to Keep One Running)

LinkedIn defends public data in layers, so a self-hosted scraper has three predictable ways to break.

The auth wall comes first. LinkedIn gates anonymous access to search and employee rosters outright. Volume from one address also ends anonymous profile access, cookie or no cookie.

Request fingerprinting comes next. IP reputation, the [TLS handshake](https://scrapfly.io/blog/posts/ja3-ja4-tls-fingerprinting-guide-to-detection-and-evasion), header order and device attributes all feed one score. A default HTTP client with a Chrome user agent still collects a 999.

Behavioral limits are the third layer and the worst to debug. The scraper keeps returning rows, but the rows are a logged-out page, a partial profile or the same 20 jobs paginated twice.

Keeping a repo alive means tracking DOM and endpoint changes and rotating [residential proxies](https://scrapfly.io/blog/posts/top-5-residential-proxy-providers) as addresses burn. That upkeep is what turns a weekend script into a standing project.

So draw the line at the fetch. The open-source repo owns parsing, pagination and the data model, and a managed fetch layer owns proxies, fingerprints and challenges.

Under that split, you patch the parser when LinkedIn moves the DOM, and the fetch layer absorbs the anti-bot changes.

## Power Your LinkedIn Scraper With Scrapfly

Every failure mode above lands on the fetch, and the fetch is what Scrapfly takes over.



ScrapFly's [Web Scraping API](https://scrapfly.io/products/web-scraping-api) is a single HTTP endpoint for collecting web data at scale, with a **99.99% success rate** across **130M+ proxies in 190+ countries**.

- [Anti-Scraping Protection bypass](https://scrapfly.io/docs/scrape-api/anti-scraping-protection) - automatically defeats Cloudflare, DataDome, PerimeterX, Akamai, and 90+ other bot systems.
- [Smart proxy rotation](https://scrapfly.io/docs/scrape-api/proxy) - residential and datacenter pools with country and ASN level geo-targeting.
- [JavaScript rendering](https://scrapfly.io/docs/scrape-api/javascript-rendering) - render SPAs and dynamic pages through real cloud browsers.
- [Browser automation scenarios](https://scrapfly.io/docs/scrape-api/javascript-scenario) - scroll, click, fill forms, and wait for elements without managing a browser fleet.
- [Format conversion](https://scrapfly.io/docs/scrape-api/getting-started#api_param_format) - return pages as HTML, JSON, clean text, or LLM ready Markdown.
- [Session management](https://scrapfly.io/docs/scrape-api/session) - keep cookies, headers, and IPs consistent across multi step flows.
- [Smart caching](https://scrapfly.io/docs/scrape-api/getting-started#api_param_cache) - cache successful responses to cut cost on repeat scraping jobs.
- [Python](https://scrapfly.io/docs/sdk/python), [TypeScript](https://scrapfly.io/docs/sdk/typescript), [Scrapy](https://scrapfly.io/docs/sdk/scrapy), and [no-code integrations](https://scrapfly.io/docs/integration/getting-started) including [Make](https://scrapfly.io/integration/make), [n8n](https://scrapfly.io/integration/n8n), [Zapier](https://scrapfly.io/integration/zapier), [LangChain](https://scrapfly.io/integration/langchain), and [LlamaIndex](https://scrapfly.io/integration/llamaindex).

You keep the open-source parsing code from entry #2 and stop maintaining the stealth half of it.



## FAQ

What is the best LinkedIn scraper on GitHub?For breadth, joeyism/linkedin\_scraper covers profiles, companies, posts and jobs from one Python library, as long as you supply a session file. For public data with no account to lose, Scrapfly's `linkedin-scraper` is the better fit.







Can I scrape LinkedIn with Python?Yes, and all five ranked repos are Python. Scrapfly's module wraps the Web Scraping API, which also has TypeScript and Scrapy SDKs if you work outside plain Python.







Can I scrape LinkedIn without logging in?Only on public surfaces. Public profiles and the guest jobs endpoint answer anonymous requests, while people search and company employee tabs redirect to the login page.







Will scraping LinkedIn get my account banned?Authenticated scraping can, so use a throwaway account. LinkedIn's User Agreement prohibits automated access, and its trust systems can restrict an account however careful your code is.







Is scraping LinkedIn legal?Scraping public, logged-out data has survived a US appellate challenge at the injunction stage, while logging in or handling personal data carries GDPR weight. See [hiQ Labs v. LinkedIn (2022)](https://cdn.ca9.uscourts.gov/datastore/opinions/2022/04/18/17-16783.pdf).







Does LinkedIn have an official API I can use instead?Yes, but it is partner-gated and narrow for data extraction. The [LinkedIn API guide](https://scrapfly.io/blog/posts/guide-to-linkedin-api-and-alternatives) covers what it does and does not allow.









## Summary

The best open-source LinkedIn scraper is the one that matches your surface and your risk tolerance. joeyism/linkedin\_scraper for breadth, JobSpy for jobs, linkedin-mcp-server for agents, StaffSpy for rosters, and Scrapfly's module for public pages.

Before you clone any of them, open the LICENSE file, read what the last commit changed, and skim the open issues. The badge, the date and the star count each lied at least once in this roster.

Prototype with the repos. When the auth wall or a per-IP throttle stops you, move the fetch to a managed layer and keep the parsing code. It is the same call you face across [social media scraping](https://scrapfly.io/blog/posts/social-media-scraping) generally.



Legal Disclaimer and PrecautionsThis tutorial covers popular web scraping techniques for education. Interacting with public servers requires diligence and respect:

- Do not scrape at rates that could damage the website.
- Do not scrape data that's not available publicly.
- Do not store PII of EU citizens protected by GDPR.
- Do not repurpose *entire* public datasets which can be illegal in some countries.

Scrapfly does not offer legal advice but these are good general rules to follow. For more you should consult a lawyer.

 

   [  Add as a preferred source ](https://google.com/preferences/source?q=scrapfly.io) Table of Contents















 

  Table of Contents- [Key Takeaways](#key-takeaways)
- [Which Open-Source LinkedIn Scraper Should You Use?](#which-open-source-linkedin-scraper-should-you-use)
- [How Did We Rank These LinkedIn Scrapers?](#how-did-we-rank-these-linkedin-scrapers)
- [1. joeyism/linkedin\_scraper: Best for Full Profile, Company, and Job Data](#1-joeyism-linkedin-scraper-best-for-full-profile-company-and-job-data)
- [2. Scrapfly linkedin-scraper: Best for Public Data Without an Account or a Ban](#2-scrapfly-linkedin-scraper-best-for-public-data-without-an-account-or-a-ban)
- [3. speedyapply/JobSpy: Best for LinkedIn Job Listings at Scale](#3-speedyapply-jobspy-best-for-linkedin-job-listings-at-scale)
- [4. stickerdaniel/linkedin-mcp-server: Best for LinkedIn Access From AI Agents](#4-stickerdaniel-linkedin-mcp-server-best-for-linkedin-access-from-ai-agents)
- [5. cullenwatson/StaffSpy: Best for Company Employee and Staff Rosters](#5-cullenwatson-staffspy-best-for-company-employee-and-staff-rosters)
- [Should You Scrape Logged Out or Log In? (The Honest Trade-off)](#should-you-scrape-logged-out-or-log-in-the-honest-trade-off)
- [Which LinkedIn Scraper Repos Should You Avoid?](#which-linkedin-scraper-repos-should-you-avoid)
- [Why Open-Source LinkedIn Scrapers Break (and How to Keep One Running)](#why-open-source-linkedin-scrapers-break-and-how-to-keep-one-running)
- [Power Your LinkedIn Scraper With Scrapfly](#power-your-linkedin-scraper-with-scrapfly)
- [FAQ](#faq)
- [Summary](#summary)
 
    Join the Newsletter  Get monthly web scraping insights 

 

  



Scale Your Web Scraping

Anti-bot bypass, browser rendering, and rotating proxies, all in one API. Start with 1,000 free credits.

  No credit card required  1,000 free API credits  Anti-bot bypass included 

 [Start Free](https://scrapfly.io/register) [View Docs](https://scrapfly.io/docs/onboarding) 

 Not ready? Get our newsletter instead. 

 

 ## Related Articles

 [     

 python scrapeguide 

### 6 Best Open-Source Instagram Scrapers in 2026

A ranked comparison of the six best open-source Instagram scrapers in 2026 with honest notes on auth model, ban risk, an...

 

 ](https://scrapfly.io/blog/posts/best-open-source-instagram-scrapers) [     

 python scrapeguide 

### 5 Best Open-Source Facebook Marketplace Scrapers on GitHub in 2026

A dated, freshness-first roundup of the open-source Facebook Marketplace scrapers on GitHub worth cloning in 2026, and t...

 

 ](https://scrapfly.io/blog/posts/best-facebook-marketplace-scrapers-github) [  

 python data-parsing 

### Web Scraping Phone Numbers with Python

In this article we'll dive into phone number scraping. We'll explore an example object and cover common phone number scr...

 

 ](https://scrapfly.io/blog/posts/how-to-scrape-phone-numbers-with-python) 

  



   



 Scale your web scraping effortlessly, **1,000 free credits** [Start Free](https://scrapfly.io/register)