# Scraper LinkedIn en Python en 2026 : 4 approches comparées (script natif, libs open-source, API publique, MCP)

> **Quick answer**: Scraper LinkedIn en Python en 2026 se fait par quatre routes : le script maison requests et BeautifulSoup qui casse sur les sélecteurs, deux bibliothèques GitHub (linkedin-scraper, linkedin-api) qui exigent un login et risquent le ban, l'API publique jobs-guest limitée aux offres d'emploi, et l'API native d'un outil comme Derrick qui contourne la couche anti-bot sans exposer votre compte LinkedIn et livre 500 profils par jour en JSON stable.

> **Summary** Scraper LinkedIn en Python en 2026 : 4 approches comparées (requests + BeautifulSoup, linkedin-scraper, linkedin-api, jobs-guest API publique, API native Derrick / MCP). Code minimal, quotas réels, risque compte et cadre RGPD pour chaque option.

*Published: 2026-05-27 · Updated: 2026-05-27 · Canonical: https://derrick-app.com/scraper-linkedin-python/*

---

> **TL;DR**

Vous êtes développeur, vous avez une liste de 200 profils LinkedIn à enrichir, et vous voulez écrire le code vous-même. Pas de SaaS à 99 €/mois, pas d’extension Chrome qui mange votre RAM, juste un script Python qui tourne en local et qui crache un CSV propre.

L’écosystème Python pour scraper LinkedIn en 2026 a quatre portes d’entrée : le script DIY avec `requests` et `BeautifulSoup`, deux bibliothèques GitHub bien tenues (`linkedin-scraper` et `linkedin-api`), l’API publique *jobs-guest* que LinkedIn sert aux visiteurs non connectés, et l’API native d’un outil comme Derrick qui vous évite la couche anti-bot. Chacune a une zone de confort différente, et choisir la mauvaise vous coûte deux jours de debug pour zéro résultat.

## Les 4 approches Python en 2026 : tableau récap

| Approche | Setup | Volume sans blocage | Login requis | Risque compte | Maintenance |
| --- | --- | --- | --- | --- | --- |
| Script DIY (requests + BeautifulSoup) | 10 min | ~50 requêtes/h sur endpoints publics | Non sur public, oui sur profils privés | Faible si pas de login | Élevée (sélecteurs cassent toutes les 2–3 semaines) |
| linkedin-scraper (joeyism, Selenium) | 30 min | ~100 profils/jour | Oui | Élevé (ban possible) | Moyenne |
| linkedin-api (tomquirk, unofficial) | 15 min | ~500 profils/jour avec cookie | Oui (cookie li_at) | Élevé | Moyenne (endpoints internes changent) |
| jobs-guest API publique | 20 min | ~1000 jobs/jour | Non | Aucun | Faible |
| API native (Derrick, Apify, autres) | 5 min | Selon quota plan | Non | Aucun (vous n’utilisez pas votre compte) | Aucune |

Détaillons chaque option avec le code minimal qui tourne.

## Approche 1 — Script natif : requests + BeautifulSoup

La méthode la plus pure : aucune dépendance externe lourde, juste deux libs Python que vous avez déjà. Elle marche bien sur les pages publiques que LinkedIn sert sans login, mais elle se heurte vite au mur quand vous voulez des données de profil.

Installation :

```
pip install requests beautifulsoup4
```

Exemple : récupérer le titre et la description d’une page *company* publique (LinkedIn About page sans authentification) :

```
import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
    "Accept-Language": "fr-FR,fr;q=0.9,en;q=0.8",
}

url = "https://www.linkedin.com/company/anthropic/about/"
response = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "html.parser")

og_title = soup.find("meta", property="og:title")
og_description = soup.find("meta", property="og:description")

print(og_title["content"] if og_title else None)
print(og_description["content"] if og_description else None)
```

Ce qui sort : le nom de la company et sa tagline. Ce qui ne sort pas : la liste des employés, les followers, les hashtags, la description complète. LinkedIn n’expose ça que derrière un login.

**Limites concrètes :** au-delà de 50 requêtes par heure depuis la même IP, vous recevez un 429 ou une redirection vers la page de login. La parade habituelle (rotation de proxies) ajoute une couche de complexité et déplace le problème, elle ne le résout pas.

## Approche 2 — Bibliothèques GitHub : linkedin-scraper et linkedin-api

Deux bibliothèques se sont imposées dans la communauté Python pour scraper LinkedIn quand on accepte d’utiliser un compte personnel.

### linkedin-scraper (joeyism, Selenium)

Cette lib pilote un Chrome headless via Selenium. Elle se logue avec vos identifiants, navigue sur le profil cible, et extrait expériences, formations, skills.

```
pip install linkedin_scraper selenium
# + chromedriver compatible avec votre version de Chrome
```

```
from selenium import webdriver
from linkedin_scraper import Person, actions

driver = webdriver.Chrome()
email = "vous@example.com"
password = "votre_mot_de_passe"
actions.login(driver, email, password)

person = Person("https://www.linkedin.com/in/<slug>/", driver=driver)
print(person.name, person.job_title)
for exp in person.experiences:
    print(exp.institution_name, exp.position_title)
```

Le code est lisible, l’API objet est propre. Le coût : vous utilisez votre compte LinkedIn comme un bot. Au-delà de 100 profils par jour, LinkedIn déclenche un warning, puis bloque le compte. Pas votre compte main si vous tenez à votre réseau.

### linkedin-api (tomquirk, unofficial)

Approche différente : pas de Selenium, juste un cookie de session (`li_at`) récupéré depuis votre navigateur. La lib appelle directement les endpoints internes que le frontend LinkedIn utilise. C’est plus rapide qu’une approche Selenium et plus discret côté détection.

```
pip install linkedin-api
```

```
from linkedin_api import Linkedin

api = Linkedin("vous@example.com", "votre_mot_de_passe")
profile = api.get_profile("public-id-du-profil")
print(profile["firstName"], profile["lastName"], profile["headline"])
```

Volume tenable avec un cookie frais : ~500 profils par jour. Au-delà, le cookie est invalidé et il faut recommencer depuis une session navigateur.

**Le piège commun aux deux libs :** les endpoints internes de LinkedIn changent sans préavis. Tous les 2 à 3 mois, vous lisez un PR open sur GitHub avec un fix de sélecteur ou d’endpoint, et vous priez pour que la maintenance soit rapide.

## Approche 3 — jobs-guest : l’API publique non documentée

LinkedIn sert ses offres d’emploi aux visiteurs non connectés via des endpoints sous `/jobs-guest/`. Ce sont des URL publiques, sans authentification, et qui retournent du HTML parseable. C’est légalement le terrain le plus sûr (données publiques, pas de login, pas de contournement d’auth), et techniquement le plus stable.

```
import requests
from bs4 import BeautifulSoup

base = "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search"
params = {
    "keywords": "sales development representative",
    "location": "Paris",
    "start": 0,
}

headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(base, params=params, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, "html.parser")

for card in soup.select("li"):
    title = card.select_one("h3.base-search-card__title")
    company = card.select_one("h4.base-search-card__subtitle")
    location = card.select_one(".job-search-card__location")
    if title:
        print({
            "title": title.get_text(strip=True),
            "company": company.get_text(strip=True) if company else None,
            "location": location.get_text(strip=True) if location else None,
        })
```

Vous itérez sur `start=0, 25, 50…` jusqu’à ce que la réponse soit vide. Volume tenable : ~1000 jobs par jour, voire plus avec un délai de 2 secondes entre requêtes. Aucun risque sur votre compte personnel puisque vous n’en utilisez pas.

Limite : ça ne marche que pour les offres d’emploi. Pas pour les profils, pas pour les companies, pas pour les posts.

## Approche 4 — API native : déléguer la couche anti-bot

Les trois premières approches partagent un problème : *vous* gérez la lutte contre les protections anti-scraping de LinkedIn. Rotation de proxies, rotation de user-agents, throttling, gestion du captcha, renouvellement de cookies. C’est un travail à temps plein qui n’apporte aucune valeur métier.

L’alternative : un fournisseur qui maintient la couche d’extraction, vous appelle une API stable, et facture au volume. Derrick par exemple expose une API REST publique qui prend une URL LinkedIn et retourne un JSON structuré avec headline, current company, employee count, followers, et plus de 20 autres champs. L’appel direct fonctionne :

```
import requests

api_key = "<votre_token_derrick>"
url = "https://api.derrick-app.com/v1/enrich/profile"

payload = {"linkedin_url": "https://www.linkedin.com/in/<slug>/"}
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
}

response = requests.post(url, json=payload, headers=headers, timeout=30)
data = response.json()
print(data["headline"], data["currentCompany"], data["followersCount"])
```

Le compte Derrick gratuit donne 100 crédits/mois (1 crédit = 1 enrichissement). Au-delà, c’est en plan payant. Le coût absorbe la maintenance que vous n’avez pas à faire, et le compte LinkedIn de votre équipe n’est jamais utilisé.

Pour les workflows pilotés par un assistant IA, Derrick expose aussi un serveur MCP (Model Context Protocol). Concrètement, Claude Desktop ou n’importe quel client MCP peut appeler les fonctions Derrick comme des outils. Si votre script Python parle déjà à Claude via l’API Anthropic, vous pouvez chaîner l’enrichissement LinkedIn dans le même tool call. Le détail technique est dans le [guide MCP scraper LinkedIn](https://derrick-app.com/scraper-linkedin-mcp-2026/).

## Cadre légal : RGPD, ToS LinkedIn, et l’arrêt hiQ

L’arrêt hiQ Labs v. LinkedIn (cour d’appel du 9e Circuit aux États-Unis, 2022) a confirmé que scraper des données publiques de LinkedIn ne violait pas le *Computer Fraud and Abuse Act*. C’est une protection américaine, elle n’existe pas en droit européen.

En Europe, deux couches se superposent :

1. **Les Conditions Générales d’Utilisation de LinkedIn** interdisent explicitement le scraping automatisé. Violer les CGU n’est pas un délit pénal en France, mais c’est un motif de suspension de compte et, théoriquement, de mise en cause civile.
2. **Le RGPD** s’applique dès que vous traitez des données personnelles d’un résident européen. Un nom, un email professionnel, une fonction : ce sont des données personnelles. Vous devez avoir une base légale documentée (l’intérêt légitime est la plus utilisée pour le B2B), informer la personne lors du premier contact (mail d’opt-in ou mention au pied d’un cold email), et respecter les droits d’accès et de suppression.

Conséquence pratique : un script Python qui scrape sans login des pages publiques est défendable. Un script qui utilise vos identifiants LinkedIn pour aspirer 1000 profils par jour viole les CGU et est exposé. Et dans les deux cas, le traitement RGPD côté CRM est obligatoire si la personne est européenne.

## Quel choix selon votre cas d’usage

| Cas d’usage | Approche recommandée | Pourquoi |
| --- | --- | --- |
| Veille marché / monitoring de jobs | jobs-guest API publique | Public, stable, pas de login |
| Enrichir 10–50 profils, prototypage | Script DIY (requests + BS4) | Rapide à écrire, suffisant pour low volume |
| Enrichir 50–500 profils/jour, projet perso | linkedin-api (tomquirk) | Volume tenable, code compact |
| Enrichir 100+ profils/jour en prod, équipe | API native (Derrick, Apify) | Pas de risque compte, SLA, maintenance déléguée |
| Workflow IA piloté par Claude/GPT | MCP server (Derrick MCP) | Tool call natif depuis l’assistant |

La règle de bon sens : si le script tournera au-delà d’une semaine en production avec un compte LinkedIn d’entreprise dessus, basculez sur une API native. Le coût mensuel est inférieur au temps de maintenance que vous y passerez, et le compte LinkedIn de la personne en charge ne risque pas le ban.

## FAQ

**Scraper LinkedIn en Python est-il légal en France ?**

Le scraping de données publiques sans login est défendable, mais viole les CGU de LinkedIn. Le traitement RGPD reste obligatoire dès que vous stockez des données personnelles européennes. L’arrêt hiQ Labs ne s’applique pas en droit européen.

**Quelle est la meilleure bibliothèque Python pour scraper LinkedIn ?**

`linkedin-api` de tomquirk pour la rapidité de mise en place (cookie de session, pas de Selenium). `linkedin-scraper` de joeyism pour une approche plus robuste basée sur Selenium. Les deux nécessitent un compte personnel.

**Peut-on scraper LinkedIn sans utiliser son compte ?**

Oui via l’endpoint *jobs-guest* (offres d’emploi uniquement) ou via une API tierce comme Derrick qui fait l’extraction côté serveur. Aucune des deux options n’utilise vos identifiants LinkedIn.

**Quel volume mon script peut-il atteindre avant un blocage ?**

Sans login : ~50 requêtes/h depuis une IP. Avec un cookie de session : 100–500 profils/jour selon la fraîcheur du cookie. Avec une API native : selon votre plan, généralement plusieurs milliers/jour.

**BeautifulSoup ou Selenium pour scraper LinkedIn ?**

BeautifulSoup suffit pour le HTML statique des pages publiques. Selenium est nécessaire dès que la donnée est rendue par JavaScript ou requiert un login. Pour un workflow Python natif sans navigateur, `linkedin-api` (cookie de session) est plus léger que Selenium.

## Pour aller plus loin

Si vous comparez plusieurs méthodes, le [guide complet sur l’extraction de données LinkedIn en 2026](https://derrick-app.com/extraction-donnees-linkedin-guide-2026/) couvre les 4 grandes familles (scrapers navigateur, APIs tierces, API officielle LinkedIn, enrichissement natif) avec la même grille.

Si votre besoin est d’enrichir sans coder (extension navigateur ou no-code), regardez plutôt [les 10 outils gratuits comparés en 2026](https://derrick-app.com/scraper-linkedin-gratuit-2026/) ou [les 12 extensions Chrome de scraping](https://derrick-app.com/scraper-linkedin-extension-chrome-2026/).

[Article connexe →](#)
