Retour au blog
Guides
Suciu DanLast updated on May 13, 202614 min read

Comment gratter LinkedIn en 2026 : un guide en Python

Comment gratter LinkedIn en 2026 : un guide en Python
En bref : extraire des données de LinkedIn implique de contourner un système d'authentification intrusif, le suivi comportemental et l'empreinte TLS. Ce guide vous propose un arbre de décision par type de page, des modèles Python fonctionnels pour les offres d'emploi, les profils et les entreprises (API cachée, JSON-LD, Selenium si nécessaire), ainsi qu'une liste de contrôle anti-blocage consolidée pour 2026.

Si vous avez déjà essayé de comprendre comment scraper LinkedIn, vous vous êtes probablement heurté au même obstacle que nous tous : une invite de connexion agressive qui s'affiche après seulement quelques pages consultées, suivie de 999 réponses silencieuses, puis plus rien d'utile du tout. Le scraping de LinkedIn consiste à extraire des données publiques (profils, entreprises, offres d’emploi et résultats de recherche) directement à l’aide de clients HTTP, de navigateurs sans interface ou d’API cachées, sans se connecter à un compte personnel. C’est techniquement plus difficile que de scraper un site de commerce électronique classique, mais c’est loin d’être impossible.

Ce guide est un tutoriel axé sur le code destiné aux développeurs, aux ingénieurs de données et aux équipes de growth ops qui ont besoin de données publiques LinkedIn sans épuiser leurs comptes ni faire tourner des proxys à l'aveuglette. Nous commencerons par ce que vous pouvez raisonnablement extraire, nous analyserons comment LinkedIn détecte les scrapers, puis nous passerons en revue trois méthodes Python (une API d'offres d'emploi cachée, l'analyse JSON-LD et un navigateur sans interface utilisateur de secours) à l'aide d'un arbre de décision afin que vous puissiez choisir la voie la plus économique et la plus fiable pour chaque type de page. La couche anti-blocage et le contexte juridique sont abordés à la fin, car ils s'appliquent quelle que soit la méthode que vous choisissez.

Quelles données LinkedIn pouvez-vous réellement extraire ?

Avant d'aborder la manière de scraper LinkedIn, il est utile d'être honnête sur ce qui est accessible depuis l'extérieur du mur d'authentification. Quatre types de pages sont utilisables sans connexion : les pages de profil public, les pages d'entreprise publiques, les offres d'emploi individuelles et la /jobs/search page de résultats. Tout le reste (Sales Navigator, l’index de recherche de personnes, les graphiques de messages, la liste complète des employés sur une page d’entreprise) se trouve derrière l’authentification et une ligne de conditions d’utilisation que ce guide ne franchira pas.

Cette surface publique recèle néanmoins une réelle valeur. Vous y trouverez les champs clés dont la plupart des équipes ont besoin pour le recrutement, la prospection commerciale et l’étude du marché du travail, à condition d’accepter que la profondeur des données soit limitée et que vous deviez éventuellement combiner plusieurs sources pour combler les lacunes.

Champs publics de LinkedIn par type de page

Le tableau ci-dessous met en correspondance chaque type de page publique avec ses champs extractibles et ses cas d'utilisation. De nombreuses demandes du type « nous voulons extraire des données de LinkedIn » s'évanouissent dès qu'une partie prenante constate ce qui est disponible sans se connecter.

Type de page

Champs publics (typiques)

Utile pour

Profil (/in/...)

Nom, fonction, titre, lieu, résumé, URL du profil, employeur

Prospection commerciale, présélection des recruteurs

Entreprise (/company/...)

Nom, secteur d'activité, siège social, abonnés, site web, nombre d'offres d'emploi

Recherche de comptes, élaboration du profil client type

Offre d'emploi (/jobs/view/...)

Intitulé, entreprise, lieu, date de publication, description, niveau d'expérience

Analyse du marché du travail, agrégation d'offres d'emploi

Recherche d'offres d'emploi (/jobs/search?...)

Liste des offres d'emploi et métadonnées de pagination

Collecte massive d'offres d'emploi à grande échelle

Si un champ ne figure pas dans ce tableau, partez du principe que le mur d'authentification fait obstacle. Un aperçu séparé des données sur les offres d'emploi constitue une lecture complémentaire utile.

Comment LinkedIn détecte et bloque les scrapers

Quiconque apprend à scraper LinkedIn découvre rapidement que les défenses sont multiples et ne se limitent pas à un simple menu. Trois couches fonctionnent en parallèle, et elles alimentent toutes un signal interne : un score de fraude par visiteur qui détermine si votre requête est approuvée, bloquée de manière souple derrière une invite de connexion, ou rejetée purement et simplement.

La première couche est le mur d'authentification. Les visiteurs anonymes sont généralement contraints de se connecter après seulement trois à cinq consultations de profil, ce qui signifie que tout scraper demandant des dizaines de profils à partir de la même identité est bloqué dès la première tentative. La deuxième couche est le suivi comportemental. LinkedIn surveille le timing des requêtes, le flux de navigation, l'activité de la souris et les schémas de référents. Un être humain ne charge pas 100 profils par minute ; un scraper non limité le fera, et ce seul signal suffit à signaler la session. La troisième couche est l'empreinte digitale de la requête. LinkedIn inspecte la qualité de l'IP (résidentielle ou centre de données), le hachage JA3 de votre poignée de main TLS, les en-têtes et les cookies, ainsi que les attributs de l'appareil. L'envoi d'un python-requests/2.x à partir d’une adresse IP AWS donne de mauvais résultats sur ces trois niveaux à la fois.

Considérez ces couches comme cumulatives, et non comme alternatives. Nettoyer l’une d’entre elles tout en ignorant les autres ne modifie que rarement votre score de fraude de manière significative. Il vaut la peine d’ajouter à vos favoris un guide sur la manière d’éviter les blocages de scrapers avant de passer à l’échelle supérieure.

Choisir comment scraper LinkedIn : un arbre de décision méthodologique

Lorsque vous décidez comment scraper LinkedIn, optez par défaut pour l'outil le plus léger qui renvoie les données dont vous avez besoin. LinkedIn est conçu comme une application monopage, ses données transitent donc par trois mécanismes, et chacun correspond à sa propre méthode de scraping idéale.

  1. HTML rendu par le serveur. Certaines pages renvoient suffisamment de données dans la réponse HTML initiale pour être analysées avec Requests et BeautifulSoup. C'est rare sur LinkedIn aujourd'hui, mais cela s'applique encore à quelques sous-pages d'entreprises et pages d'entités.
  2. JSON hydraté dans des <script> balises. Les profils publics et les pages d'entreprise intègrent un <script type="application/ld+json"> bloc qui reflète les champs affichés sur la page visible. L'analyse de ce bloc est plus rapide, moins coûteuse et bien moins fragile que de rechercher des sélecteurs CSS à travers le DOM.
  3. XHR / API cachées. Les expériences de défilement infini (flux d'offres d'emploi, liste des offres d'emploi d'une entreprise, recherche) appellent des points de terminaison internes avec des paramètres de requête prévisibles. La reproduction de ces appels contourne entièrement le rendu.

Règle d'or : essayez d'abord JSON-LD pour les pages de profil et d'entreprise, réutilisez l'API cachée pour les offres d'emploi et la recherche, et n'utilisez un navigateur headless que lorsque les deux échouent. La plupart des équipes qui cherchent à scraper LinkedIn à grande échelle dépensent trop en Selenium pour des tâches qu'un script Requests de trente lignes peut accomplir.

Méthode 1 : Comment extraire les offres d'emploi LinkedIn via l'API cachée « Jobs-Guest »

Le point de terminaison de recherche d'offres d'emploi est la surface LinkedIn la plus facile à scraper : il est intentionnellement accessible aux visiteurs non authentifiés et paginé par un seul start . Au moment de la rédaction de cet article, le chemin est /jobs-guest/jobs/api/seeMoreJobPostings/search, et la réponse renvoie des fiches d'emploi au format HTML plutôt qu'en JSON. LinkedIn modifie régulièrement ses points de terminaison internes ; vérifiez donc le chemin dans DevTools avant toute exécution en production.

Un modèle Python minimal, analysé avec BeautifulSoup, ressemble à ceci :

import requests
from bs4 import BeautifulSoup

BASE = "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search"
HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
}

def fetch_page(keywords, location, start=0):
    params = {"keywords": keywords, "location": location, "start": start}
    r = requests.get(BASE, params=params, headers=HEADERS, timeout=20)
    r.raise_for_status()
    return r.text

def parse_cards(html):
    soup = BeautifulSoup(html, "html.parser")
    for card in soup.select("li"):
        title = card.select_one(".base-search-card__title")
        company = card.select_one(".base-search-card__subtitle")
        loc = card.select_one(".job-search-card__location")
        link = card.select_one("a.base-card__full-link")
        if title and link:
            yield {
                "title": title.get_text(strip=True),
                "company": company.get_text(strip=True) if company else None,
                "location": loc.get_text(strip=True) if loc else None,
                "url": link["href"].split("?")[0],
            }

jobs, start = [], 0
while True:
    html = fetch_page("python developer", "Berlin", start)
    batch = list(parse_cards(html))
    if not batch:
        break
    jobs.extend(batch)
    start += 25

La taille de la page est de vingt-cinq fiches. La condition d'arrêt est un ensemble de résultats vide, et non un nombre de pages fixe, car LinkedIn filtre les résultats en fonction de la localisation géographique et de la date de publication. Transférez jobs dans le csv ou un cadre Pandas et vous obtenez un flux d'offres d'emploi LinkedIn sans passer par un navigateur. Un tutoriel BeautifulSoup couvre les modèles de sélecteurs si vous avez besoin d'un rappel.

Méthode 2 : Comment extraire des profils et des entreprises LinkedIn via JSON-LD

Pour optimiser l'extraction d'informations des pages de profil et d'entreprise, il faut ignorer complètement les sélecteurs CSS et analyser le <script type="application/ld+json"> bloc que LinkedIn injecte lors du rendu côté serveur. JSON-LD est structuré, stable et change bien moins souvent que le DOM visible. Pour le trouver sur n'importe quelle URL LinkedIn publique, ouvrez DevTools et recherchez //script[@type='application/ld+json'] dans le panneau Éléments.

import json
import requests
from bs4 import BeautifulSoup

HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
}

def scrape_ld(url):
    r = requests.get(url, headers=HEADERS, timeout=20)
    r.raise_for_status()
    soup = BeautifulSoup(r.text, "html.parser")
    blob = soup.find("script", {"type": "application/ld+json"})
    if not blob:
        return None
    return json.loads(blob.string)

# Public profile
profile = scrape_ld("https://www.linkedin.com/in/some-public-handle/")
# Public company
company = scrape_ld("https://www.linkedin.com/company/openai/")

Pour un profil public, attendez-vous à trouver des champs tels que name, jobTitle, worksFor, address, et parfois alumniOf. Pour une entreprise, attendez-vous à name, description, url, numberOfEmployeeset un address bloc. Tout ce que LinkedIn cache derrière une connexion (liste complète des employés, relations communes, coordonnées) ne sera pas présent dans le JSON-LD ; il ne s'agit pas d'un bug d'analyse, mais du mur d'authentification.

N'utilisez l'analyse HTML que pour les champs que le JSON-LD n'expose pas, comme le carrousel « pages similaires » sur les pages d'entreprise, et considérez ces sélecteurs comme la partie la plus fragile de votre pipeline. C'est également là que se concentre la majeure partie du temps de maintenance, car LinkedIn modifie généralement le balisage de son interface utilisateur toutes les deux à quatre semaines.

Méthode 3 : navigateurs sans interface pour la recherche et les sections à chargement différé

N'utilisez Selenium ou Playwright que lorsque les deux premières méthodes s'avèrent insuffisantes. Les cas courants sont les résultats de recherche de personnes, l'onglet « Emplois dans cette entreprise » à chargement différé, et toute page où des données critiques apparaissent après un événement de défilement. Si vous n'en avez jamais créé auparavant, une introduction aux navigateurs sans interface graphique est un prérequis utile, et le tutoriel Selenium avec Python vous guide à travers la configuration du pilote si vous en avez besoin.

Le workflow minimal se présente ainsi : lancez un pilote Chromium, naviguez avec un agent utilisateur réaliste, attendez que le réseau se stabilise, faites défiler jusqu’à ce que le bloc pertinent se charge, puis récupérez le DOM à l’aide d’un localisateur Selenium ou passez driver.page_source à BeautifulSoup. Ne vous connectez pas à un vrai compte LinkedIn dans Selenium. Cette combinaison enfreint les conditions d'utilisation de LinkedIn et constitue le moyen le plus rapide de se faire bannir définitivement.

Les navigateurs sans interface graphique ne constituent pas à eux seuls une solution anti-bot. Vanilla Puppeteer et Playwright sont faciles à identifier au niveau JA3 et navigator au niveau des objets ; vous aurez donc toujours besoin des contrôles de proxy et de rythme décrits dans la section suivante. Si une tâche peut être effectuée sans navigateur, faites-la sans navigateur.

Liste de contrôle anti-blocage : proxys, en-têtes, JA3 et régulation

Lorsque les équipes qui cherchent à extraire des données de LinkedIn passent d’un script ponctuel à un crawl récurrent, le mode de défaillance est presque toujours lié à l’anti-bot, et non à l’analyse. Suivez cette liste dans l’ordre.

  1. Utilisez des proxys résidentiels, pas ceux de centres de données. LinkedIn tient à jour une liste exhaustive des ASN de centres de données. Les pools résidentiels font tourner les adresses IP réelles des FAI grand public et sont beaucoup plus difficiles à détecter. Un guide sur l'utilisation des proxys avec Python Requests est le meilleur point de départ si vous n'avez jamais mis en place de rotation auparavant.
  2. Faites attention à votre empreinte JA3. Plain requests possède une empreinte TLS qui ne correspond à aucun navigateur réel. Les outils qui encapsulent curl_cffi ou rejouent le hachage JA3 d'un vrai navigateur passeront ce contrôle ; raw requests ne le passera pas.
  3. Envoyez un ensemble complet d'en-têtes. Au minimum : un User-Agent, Accept, Accept-Language, Accept-Encodinget un Referer. L'absence Accept-Language est en soi un indice fort de scraper.
  4. Allez-y doucement. Limitez le nombre de connexions simultanées, variez les délais de 1 à 5 secondes et n'effectuez jamais de pics de trafic.
  5. Faites tourner les identités, pas seulement les adresses IP. Associez chaque rotation d'adresse IP à un nouvel agent utilisateur et un nouveau cookie jar afin que LinkedIn ne puisse pas relier les sessions entre elles.

Si vous êtes toujours bloqué de manière souple après avoir suivi cette liste, le problème vient du volume, pas de la configuration. Ralentissez.

Le scraping de LinkedIn est-il légal ?

L'affaire américaine phare est hiQ Labs c. LinkedIn, dans laquelle les tribunaux ont statué, en substance, que le scraping de données LinkedIn accessibles au public ne constitue pas une violation de la loi sur la fraude et les abus informatiques (Computer Fraud and Abuse Act). Le litige s'est déroulé de 2017 à 2022 environ et s'est terminé après la publication des avis de la Cour d'appel du neuvième circuit ; pour connaître l'état actuel et la portée exacte de la décision, la page de l'EFF consacrée à l'affaire hiQ c. LinkedIn constitue une référence claire et accessible. Cette décision a deux limites : elle ne prévaut pas sur les conditions d'utilisation de LinkedIn, qui interdisent toujours l'accès automatisé lorsque l'utilisateur est connecté, et elle ne s'applique pas en dehors de la juridiction américaine. Si vous effectuez du scraping à l'échelle commerciale, considérez ces informations comme un contexte et consultez un avocat avant de lancer votre projet. Il est également utile de lire un guide général sur la légalité du web scraping.

Points clés

  • Adaptez la méthode au type de page, et non à vos habitudes. JSON-LD est la solution idéale pour les pages de profil et d'entreprise, l'API « hidden jobs » l'emporte pour les offres d'emploi et la recherche, et un navigateur headless est une solution de secours, pas la norme.
  • Trois niveaux de défense, un seul score de fraude. Le mur d'authentification, le suivi comportemental et l'empreinte TLS/en-tête alimentent tous le même score interne ; nettoyer un seul de ces éléments change rarement le résultat.
  • Les proxys résidentiels associés à des clients HTTP compatibles JA3 constituent la base. Les adresses IP de centres de données seules ne vous permettront pas de mettre en place un pipeline fonctionnel sur LinkedIn.
  • Ne vous connectez jamais via l'automatisation. Cela enfreint les conditions d'utilisation et entraîne la suspension définitive des comptes, quelle que soit la précision de vos sélecteurs.
  • Prévoyez les pannes. LinkedIn modifie généralement son interface toutes les deux semaines ; concevez des sélecteurs et des analyseurs JSON que vous pouvez remplacer dans un seul fichier.

FAQ

Puis-je extraire des données de LinkedIn sans me connecter à un compte ?

Oui, mais uniquement la partie publique. Les pages de profil publiques, les pages d'entreprise, les offres d'emploi individuelles et le /jobs/search point de terminaison sont accessibles sans authentification. Sales Navigator, l'index de recherche de personnes, les données sur les relations communes et la liste complète des employés sur une page d'entreprise ne le sont pas. Les scrapers anonymes sont également confrontés à une invite de connexion après environ trois à cinq consultations de profil ; prévoyez donc une rotation des adresses IP et des identités dès le premier jour.

Dois-je utiliser l'API officielle de LinkedIn plutôt que de scraper ?

Probablement pas pour la collecte de données générale. L'API officielle de LinkedIn a une portée très limitée : elle est conçue pour les intégrations de partenaires telles que les candidatures à des offres d'emploi, le partage de publications ou l'automatisation du marketing, et elle ne renvoie pas le type de données de profil public ou d'entreprise dont la plupart des projets de scraping ont besoin. La plupart des équipes qui évaluent l'API officielle finissent par scraper le site public pour couvrir ce que l'API ne couvre pas.

Quel type de proxys fonctionne le mieux pour le scraping de LinkedIn : résidentiels ou de centre de données ?

Les proxys résidentiels, avec rotation. LinkedIn gère des listes de blocage agressives des ASN de centres de données (AWS, GCP, OVH et autres), de sorte que les adresses IP de centres de données sont très rapidement limitées ou reçoivent une réponse 999. Les pools résidentiels transitent par de véritables adresses IP de FAI grand public et ressemblent à du trafic utilisateur ordinaire. Pour les extractions ponctuelles de faible volume, les proxys mobiles fonctionnent également, mais ils sont surdimensionnés et plus coûteux pour la plupart des tâches.

Comment savoir si mon scraper LinkedIn est sur le point d'être bloqué ?

Surveillez trois signaux précurseurs. Premièrement, une augmentation des temps de réponse (LinkedIn met souvent un certain temps avant de bloquer). Deuxièmement, une augmentation du nombre de pages renvoyant une page de connexion au lieu du contenu. Troisièmement, les réponses HTTP 999, qui sont le code spécifique de LinkedIn indiquant « vous avez été signalé ». Si l'un de ces trois éléments augmente au cours d'une heure, suspendez le crawl et changez d'identité avant que la situation ne s'aggrave.

À quelle fréquence LinkedIn modifie-t-il la structure de ses pages et rend-il les scrapers inopérants ?

Fréquemment. Les sélecteurs HTML et CSS du front-end changent généralement toutes les deux à quatre semaines, les points de terminaison de l'API Voyager interne tournent environ toutes les quatre à huit semaines, et les structures JSON-LD ont tendance à rester stables pendant plusieurs mois. Ancrez vos scrapers sur JSON-LD ou des API cachées lorsque c'est possible, isolez les sélecteurs CSS fragiles dans un module unique, et prévoyez une petite session de maintenance chaque mois.

Conclusion

Pour réussir à scraper LinkedIn à grande échelle, ce ne sont pas tant les astuces ingénieuses qui comptent que la rigueur. Choisissez la méthode la plus légère pour chaque type de page, respectez le mur d’authentification et considérez la couche anti-bot comme une priorité absolue plutôt que comme une réflexion après coup. Le JSON-LD prendra en charge la majeure partie de votre travail sur les profils et les entreprises. Le point de terminaison jobs-guest prendra en charge la majeure partie de votre travail sur le marché de l’emploi. Réservez Selenium aux surfaces véritablement dynamiques, ne l'exécutez jamais en étant connecté, et consacrez votre temps d'ingénierie aux proxys, à la gestion du rythme et à l'hygiène JA3 plutôt qu'à un script Selenium plus sophistiqué.

La maintenance représente l'autre moitié du travail. LinkedIn refond son frontend à un rythme de quelques semaines, alors concevez des parseurs qui signalent clairement les échecs, consignez les changements structurels et isolez les sélecteurs afin qu'une correction se résume à la modification d'un seul fichier plutôt qu'à une réécriture.

Si vous préférez ignorer complètement les couches proxy, empreinte digitale et CAPTCHA pour vous concentrer sur les données elles-mêmes, l'API Scraper de WebScrapingAPI gère le côté requête (rotation d'IP, JA3, en-têtes, tentatives) derrière un point de terminaison unique et renvoie du HTML brut que vous pouvez analyser avec le même code Requests-plus-BeautifulSoup que vous avez déjà écrit ci-dessus. La logique de scraping reste la vôtre ; le déblocage est le nôtre.

À propos de l'auteur
Suciu Dan, cofondateur @ WebScrapingAPI
Suciu Dancofondateur

Suciu Dan est le cofondateur de WebScrapingAPI et rédige des guides pratiques destinés aux développeurs sur le web scraping avec Python et Ruby, ainsi que sur les infrastructures de proxy.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.