Comment scraper les données linkedin like a boss ?

Scraper linkedln

16 Août Comment scraper les données linkedin like a boss ?

Contexte

 

L’objet de cet article est de présenter les grands principes à mettre en œuvre pour se constituer une base personnelle de contacts à partir de recherches linkedin, ie à usage uniquement personnelle en accord avec les conditions d’utilisation de linkedin.

Si on se réfère aux sachants du domaine (https://www.islean-consulting.fr/fr/transformation-digitale/scraping-pages-web-legal/), scraper n’est pas une activité illégale en soi. C’est l’utilisation faite des données récoltées par la suite qui peut l’être. A chacun nous donc d’être vigilant et d’agir en pleine conscience. Le scraping présenté n’est utilisé que par moi car je possède les licences Linked Sales Navigator nécessaires.

[/vc_column_text]

[/vc_column][/vc_row]

Scraper linkedin pour quoi faire ?

 
Scraper linkedin, c’est avant tout un moyen simple de se constituer une base qualifiée de contacts pour la prospection, le recrutement ou encore l’identification de leaders d’opinion.

Cette démarche est notamment pertinente pour des jeunes sociétés qui n’ont pas les moyens de se procurer des bases de données pour le moins couteuses et pour lesquelles il faut dépenser 1 à plusieurs euros par contact.

On ne présente pas ici l’intégrabilité des opérations à réaliser pour récupérer des emails valides ni le code à proprement parlé mais vous pourrez trouver des informations qui – je l’espère – vous faciliteront déjà grandement la vie. Les sections concernant la mise en œuvre ont réalisées par Arthur que je remercie ici.

Cette méthode est largement perfectible mais elle est efficience et nous permet de récupérer 100% des données linkedin et environ 20% d’emails valides.

Ce que l’on cherche à faire

 
Le but ici est de scraper la page des résultats de linkedin sales navigator qui une option payante du site. Cette option permet d’effectuer des recherches de profil très précises en fournissant par exemple la fonction, la région ou encore le type d’entreprise des personnes recherchées.

Voici par exemple les résultats de la recherche sur les directeurs commerciaux télécom de la région parisienne :

Recherche linkedln
Exemple de résultat d'une recherche Linkedln Sales Navigator

L’ambition initiale est d’avoir un bouton côté navigateur qui puisse envoyer le contenu de la page à un job d’intégration talend qui puisse ensuite traiter le contenu de la page web pour le structurer et le charger dans une base de données.

L’objectif est notamment de sauvegarder les attributs en gras dans la réponse type suivante :

{« matchedPosts »:[],
« isMemberBlocked »:false,
« company »:{
« tenureAtRole »:{« month »:9, »year »:2},
« companyName »: »Axione »,
« tenureAtCompany »:{« month »:7, »year »:12},
« title »: »\u003cb\u003eDirecteur\u003c/b\u003e \u003cb\u003eCommercial\u003c/b\u003e »,
« companyId »:34571
},

« privacy »:{« canSendInMail »:true},
« isInmailCta »:false,
« member »:{
« location »: »ParisArea,France »,
« authToken »: »rTpN »,
« pictureId »: »/p/4/005/08d/0b2/351b87f.jpg »,
« authType »: »NAME_SEARCH »,
« memberId »:3540809,
« title »: »\u003cb\u003eDirecteur\u003c/b\u003e \u003cb\u003eCommercial\u003c/b\u003e »,
« pastPositions »:[],
« formattedName »: »Prénom NOM »
},

« numSharedConn »:77,
« badges »:{« distance »:1, »isOpenlink »:false, »isShowSubscriber »:true, »isCrmImported »:false}
}

Analyse des solutions souhaitées

 

3 solutions envisagées

La partie de “pur scraping” ne pose pas de problème, les informations à scraper sont facilement trouvables dans la page en question (plus de détails plus bas).

L’enjeu principal est d’effectuer des requêtes sur le serveur de LinkedIn via un script en apparaissant comme logué avec le compte premium afin de récupérer la réponse contenant les informations ciblées.

Pour cela 3 solutions ont été envisagées :

  • 2 solutions “propres” :
    • écrire un script python simulant le processus de login.
    • récupérer les cookies d’identification via une extension navigateur (en Javascript)
  • une solution détournée : effectuer les requêtes en Javascript directement via le navigateur (pendant l’ouverture d’une session premium dans celui-ci)

Elimination de la solution de login via un script python

Le processus de login sur linkedin est parfois doublé d’une vérification de type captcha :

Captcha
Captcha

Cette vérification ne peut pas être outrepassé par un script et bloquera toutes les futures connexions au site. La voie du script de login n’est donc pas viable.

 

De plus cette méthode nécessite que le script ait accès au mot de passe du compte premium. Cela implique que le mot de passe soit écrit en clair (soit dans le code soit dans une BDD) ce qui n’est pas une bonne pratique du point de vue de la sécurité.

Conserver l’intelligence côté Python

L’un des enjeux pour ce scraping est de conserver le plus possible l’intelligence du processus côté Python, c’est donc la solution de récupération des cookies via une extension navigateur qui a été retenue. Elle a également l’avantage d’alléger la communication entre le client et le serveur de scraping. En effet, cette solution ne nécessite l’envoi que de 2 cookies et une url tandis que la solution détournée demanderait l’envoi du contenu de chacune des pages à scraper.

Structure de l’application

 

Récupération et rôle des cookies

LinkedIn utilise un système d’authentification qui fonctionne d’une manière assez classique :

Authentification Linkedln
Principe d'authentification linkedln.

Les cookies reçus sont ensuite stockés sur le navigateur et envoyés avec chaque requête suivante pour apparaître comme identifié.

Il faut donc récupérer les cookies d’identification du compte et des fonctionnalités premium pour pouvoir obtenir les pages “personnelles” contenant les résultats à scraper.

Le cookies d’identification à un compte LinkedIn se nomme li_at. Celui d’identification à Sales Navigator est li_a.

Pour déterminer le rôle des cookies et lesquels sont importants, une façon de faire est d’examiner la communication client – serveur. Pour cela, on peut utiliser 2 outils : l’onglet Network de l’outil de développement de chrome et Postman.

Un accès restreint aux cookies

La récupération des cookies est faite via une extension chrome donc écrite en Javascript. Au départ, nous souhaitions récupérer les cookies via document.cookie qui est une string de la forme key=value mais certains cookies n’apparaissent pas dans cette chaîne de caractères. Ceux qui ont l’option Secure :

Cookie sécurisé
Cookie sécurisé

Cette option est une protection contre les failles XSS. Par exemple cela évite qu’un script caché dans le message d’un autre utilisateur vole le cookie en question (et vole ainsi l’usage du compte momentanément, tant que le cookie est valable).

Cependant, les extensions navigateurs offrent au JavaScript des APIs supplémentaires. Notamment l’API chrome.cookies qui permet de manipuler les cookies et notamment de récupérer les cookies avec l’option Secure.

Utilisation des cookies

Une fois les bons cookies récupérés, il suffit de les “joindre” à une requête pour que le serveur LinkedIn identifie l’émetteur de la requête comme loggé et réponde en conséquence. La librairie Python requests permet de le faire facilement via l’option cookies : requests.get(url, cookies=cookie_jar) .

Le scraping

 
Comme pour beaucoup de sites sophistiqués aujourd’hui, de nombreuses pages Linkedin sont construites via du JavaScript. La page chargée ne contient ainsi pas la structure finale du DOM mais un script JavaScript de construction disposant des informations nécessaires.

Le scraping ici est donc assez inhabituel mais finalement pas difficile. Les informations sont contenues dans une balise <code> sous forme de JSON.

Cette structure a l’avantage d’être assez proche d’un dictionnaire Python. Il existe d’ailleurs la fonction json.loads pour convertir une string JSON en dictionnaire Python.

Le scraping consiste donc dans ce cas à récupérer la string JSON dans le HTML puis à parcourir le dictionnaire obtenu pour récupérer les informations ciblées. Il faut aussi “cleaner” un peu les données. Par exemple la donnée company.tenureAtRole est de la forme (dict) {“year”: 4, “month”: 3} qui n’est pas stockable directement dans une bdd SQL et doit donc être transformée.

Organisation du projet talend

 
Le projet de data integration a été séparé en 2 jobs :

  • le service REST en lui-même
  • l’insertion dans la bdd du fichier CSV écrit par le script de scraping

Le 2ème est très simple et est appelé par le premier après chaque exécution du script de scraping.

Talend job csv to BDD
Talend job csv to BDD

Le premier est un peu plus complexe :

Projet talend scraping
Projet talend scraping

Il se décompose en deux chaînes d’action :

La chaîne 1 est déclenchée par la réception d’une requête POST contenant les paramètres de scraping (cookies et url). Ces deux paramètres sont alors chargés en context et le service REST renvoie une réponse contenant “scraping launched”.

La réponse “scraping launched” déclenchera l’envoi d’une deuxième requête par l’extension. Cette requête GET activera la chaîne 2 dont le fonctionnement est décrit sur l’image. Le composant tSystem utilisera les variables de context chargées précédemment pour transmettre les paramètres de scraping au script Python.

Voilà, les données sont stockées en base. Ne reste plus qu’à récupérer les emails. Vous pouvez pour cela vous référer à l’article recherche email d’un prospect.

N’hésitez pas à nous faire part de vos commentaires.

Amicalement.

Athi.

1Comentaire
  • BestJade
    Posted at 22:15h, 07 novembre

    I have noticed you don’t monetize your site, don’t
    waste your traffic, you can earn extra bucks every month.
    You can use the best adsense alternative for any type of website (they
    approve all websites), for more info simply search in gooogle: boorfe’s tips monetize
    your website

Envoyer un commentaire