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.

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 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 ou les 12 extensions Chrome de scraping.

Article connexe →
Posted in
Growth Hacking

Jonathan Maurin

Related Posts

Post a comment

Your email address will not be published.