Pourquoi scraper des données ?
- Suivi de positions : scraper les résultats de google
- Recetter un site : scraper des éléments d’un site pour voir s’ils sont en place
- Récupérer des mots clés : scraper le menu, le contenu, etc.
Skrapp
Avantages
Fait le boulot : trouver des emails sur linkedin
Défauts
Version gratuite assez limitée
Inscription au service obligatoire
Import.io, dexi, parsehub, scrapinghub
Avantages
Fait le boulot
Facile d’utilisation (point and click)
Défauts
Version gratuite assez limitée
Inscription au service obligatoire
Import.io, dexi, parsehub, scrapinghub
Avantages
Fait le boulot
Facile d’utilisation (point and click)
Défauts
Version gratuite assez limitée
Inscription au service obligatoire
Extraire les données d’une page
Quelques outils :
▪ Scrape similar (scraper), un addon chrome:
https://chrome.google.com/webstore/detail/mbigbapnjcgaffohmbkdlecacce
pngjd
▪ Xpath helper :
https://chrome.google.com/webstore/detail/hgimnogjllphhhkhlmebbmlgjoejd
pjl
▪ Chrome dev tools
Scraper (scrape similar)
Avantages
Ultra facile d’utilisation
Possibilité de personnaliser les requêtes
avec le xpath
Mémoriser les requetes
Défauts
Page par page
Uniquement sur chrome
DEMO SCRAPER
Je veux obtenir la filmographie
d’Albert Dupontel (acteur).
https://www.imdb.com/name/nm0
243355/?ref_=ttfc_fc_cl_t1
Comprendre le xpath
Scraper donne :
// div[2] / div / b / a
Ce qui se traduit par :
Les balises a, dans une balise b, dans une balise div, dans (à partir de) la 2e div
Comprendre le xpath
Scraper donne :
// div[2] / div / b / a
Ce qui se traduit par :
Les balises a, dans une balise b, dans une balise div, dans (à partir de) la 2e div
// div[2] / div
Le html
div
div
bspan
ph1
a
div
body
// div[2] / div / b
Le html
div
div
bspan
ph1
a
div
body
// div[2] / div / b / a
Le html
div
div
bspan
ph1
a
div
body
Sélectionner les nœuds
Un nœud : un élément, un attribut, un commentaire, du texte,….
nodename Tous les noeuds avec le nom “nodename”
/ Sélectionne depuis le noeud racine
// Sélectionne tous les noeuds dans le document depuis le noeud
demandé, peu importe leur emplacement dans le document
. Sélectionne le nœud courant
.. Sélectionne le parent du noeud courant
@ Sélectionne un attribut
Les axes
ancestor Sélectionne les ascendants (parent, grandparent, etc.) du noeud courant
ancestor-or-self Sélectionne les ascendants et le noeud courant
attribute Sélectionne tous les attributs du noeud courant
child Sélectionne tous les enfants du noeud courant
descendant Sélectionne tous les descendants (enfants, petits enfants,…) du noeud courant
descendant-or-self Sélectionne les descendants et le noeud courant
following Sélectionne tout ce qui est après la balise fermante du noeud courant
following-sibling Sélectionne tous les frères/soeurs après le noeud
parent Sélectionne les parents du noeud
preceding Séletionne tous les noeuds qui apparaissent avant le noeud courrant, sauf les ascendants, les
attributs et les namespaces.
preceding-sibling Sélectionne tous les frères/soeurs avant le noeud
self Selectionne le nœud courant
Les prédicats
/bookstore/book[1] Sélectionne le premier élément book qui est dans l’élément bookstore
/bookstore/book[last()] Sélectionne le dernier élément book qui est dans l’élément bookstore
/bookstore/book[last()-1] Sélectionne l’avant-dernier élément book qui est dans l’élément
bookstore
/bookstore/book[position()<3] Sélectionne les 2 premiers éléments book qui sont dans l’élément
bookstore
//title[@lang] Sélectionne tous les title qui ont un attribut lang
//title[@lang='en'] Sélectionne tous les title qui ont un attribut lang dont la valeur est égale à
"en"
/bookstore/book[price>35.00] Sélectionne tous les éléments book dont l’attribute prix est strictement
inférieur à 35 qui sont dans l’élément bookstore
/bookstore/book[price>35.00]/title Sélectionne tous les éléments title qui sot dans les éléments book qui ont
un attribute prix inférieur à 35, qui sont dans l’élément bookstore
@ : les attributs
//div[@id=‘toto’]
Tous les div avec un attribut id = toto
//*[@itemprop]
Tous les éléments qui ont un attribut itemprop
//a/@href
tous les attributs href des balises a
//a[@rel=‘nofollow’]/@href
tous les attributs @href des éléments a ayant un attribut rel = nofollow
Les opérateurs
Operator Description Example
| Demande 2 élements (ET) //book | //cd
+ Addition 6 + 4
- soustraction 6 - 4
* Multiplication 6 * 4
div Division 8 div 4
= Egal à price=9.80
!= Différent de price!=9.80
< Inférieur à price<9.80
<= Inférieur ou égal à price<=9.80
> Supérieur à price>9.80
>= Supérieur ou égal à price>=9.80
or ou price=9.80 or price=9.70
and Et price>9.00 and price<9.90
mod modulo 5 mod 2
Les fonctions
concat Concatène les chaines
starts-with Vérifie si la chaine commence par
contains Vérifie si la chaine contient
ends-with Vérifie si la chaine ermine par
string-join Joindre des chaines de caractères
last() Sélectionne le dernier
position() Sélectionne la position
count() Compte le nombre d’éléments
not Qui est l’inverse de
replace substitue
match Vérifie si la chaine correspond à l’expression régulière
Web scraper
Avantages :
Très facile d’utilisation
Multipages
Éléments dynamiques
Export csv
Un bon outil de fainéant
Sélecteurs css
Défauts
Pas de xpath
DEMO Web Scraper : google maps
Je veux scraper les résultats de google maps
DEMO Web Scraper : google maps
Je sélectionne chaque brique de résultat
(éléments, et multiple)
DEMO Web Scraper : google maps
Une par une, je sélectionne chaque information du bloc, qui m’intéresse.
(Texte)
DEMO Web Scraper : google maps
J’utilise le meme scraper pour d’autres types de résultats
DEMO WEB SCRAPER : suivre les liens
Je veux scraper la filmographie d’albert dupontel + tout le casting des films dans lesquels il a joué
https://www.imdb.com/name/nm0243355/?ref_=ttfc_fc_cl_t1
imacro
Avantages
• Multi navigateurs
• Récursivité
Défauts
• Le gratuit est plus limité
• Incompatible avec la derniere version
de FF
Imacro pour scraper les PAA
VERSION BUILD=1002 RECORDER=CR
'URL
GOTO=https://www.google.fr/search?q=comment+faire+une+mayonnaise&oq=comment+faire+u
ne+mayonnaise
SET !LOOP 1
TAG POS={{!loop}} TYPE=DIV ATTR=CLASS:aCBg7&&TXT:
WAIT SECONDS=2
TAG XPATH="//div[@decode-data-ved][{{!loop}}]/div[1]" EXTRACT=TXT
TAG XPATH="//div[@decode-data-ved][{{!loop}}]/div[2]" EXTRACT=TXT
Xidel
Avantages :
Multiples sélecteurs
Compatible xpath 3.0
Peut s’intégrer dans des scripts
Simple et puissant
Défauts
Pas très user friendly
Ligne de commande (pas de rendu JS)
Exemple : extraire les urls à partir d’un index de sitemap
xidel https://www.washingtonpost.com/news-sitemap-index.xml -f « //loc » -e « //loc » > url.txt
Extraire les titres des résultats de google
xidel http://www.google.de/search?q=test --follow "//a/extract(@href, 'url[?]q=([^&]+)&', 1)[. !=
'']" --extract //title --download '{$host}/'
Les outils
Utiliser les crawlers existants :
- Screaming frog
- Botify (ne supporte pas le xpath dans les champs personnalisés
- Mnogosearch
- …
Créer son propre crawler
(en partant d’un framework existant)
Scrapy
Avantages
Asynchrone
Crawler : logique de crawl + nettoyage +
stockage des données
Compatible avec d’autres modules python
(beautiful soup)
Défauts :
Plusieurs modules à installer
Connaître le python
Les composants principaux
▪ Projet : structure globale
▪ Spider : Correspond à la logique de crawl et d’extraction (penser en général un spider = un
site web)
▪ Spidermiddleware : prépare/filtre les requêtes avant envoi au scheduler (referer, longueur de
l’url maximum, depth)
▪ Scheduler : reçoit les urls récupérés, canonicalise, vérifie les urls déjà scrapés, programmes les
prochains urls à scraper
▪ Downloader middleware : gestion des cookies, des redirections, des erreurs http
▪ Items : stockage temporaires des données scrapées (penser un item = une ligne d’un csv)
▪ Itemloader : Nettoyage des données scrapées (suppression des espaces, conversion des
devises)
▪ Pipeline : stockage des données finales : JSON, JSONlines, XML, DB, amazon S3