00:00:00
scraper un PDF et scraper un site web ce
00:00:03
sont deux choses totalement différentes
00:00:04
lorsque l'on scrapent un site web on se
00:00:07
base sur le code HTML on a des éléments
00:00:10
distinctifs facilement identifiables
00:00:12
mais sur un PDF il n'y a pas tout ça et
00:00:15
pourtant sur un PDF il peut y avoir tout
00:00:18
un tas d'informations utiles et c'est
00:00:21
notamment le cas lorsqu'on scrapent des
00:00:22
factures l'approche sera donc
00:00:24
nécessairement différente mais elle
00:00:26
reste néanmoins possibles et voici
00:00:28
comment juste avant de commencer si vous
00:00:31
avez besoin d'une prestation de ce type
00:00:33
ou d'une prestation en webstrapping de
00:00:35
manière générale vous pouvez me demander
00:00:37
mes tarifs et m'expliquer votre demande
00:00:40
via cette adresse email vous l'avez
00:00:42
compris dans cette vidéo on va scrapper
00:00:45
un fichier PDF avec Python auparavant on
00:00:48
va un petit peu déterminer les enjeux de
00:00:50
ce scrap les enjeux de ce tutoriel on a
00:00:53
du coup sous les yeux une facture votre
00:00:55
facture la mienne pour le coup est
00:00:57
fictive pour des raisons de
00:00:59
confidentialité
00:01:00
mais si néanmoins vous souhaitez prendre
00:01:02
exactement la même pour vous entraîner
00:01:04
et pour éviter de potentielles erreurs
00:01:06
j'essaierai de vous la mettre sur mon
00:01:08
canal telegram le lien est en
00:01:10
description deuxièmement on va faire une
00:01:12
distinction entre les données dites
00:01:14
statiques et les données dynamiques
00:01:16
l'objectif c'est qu'à la fin on est un
00:01:19
fichier CSV ou Excel avec 3 lignes donc
00:01:22
une ligne pour chacune des prestations
00:01:25
on aura du coup d'un côté les données
00:01:26
statiques c'est à dire les données qui
00:01:28
par définition ne vont pas être
00:01:29
modifiées peu importe le type de
00:01:31
prestation que l'on veut avoir en
00:01:33
d'autres termes c'est tout ce qui n'est
00:01:35
pas inclus dans ce tableau ça peut être
00:01:37
le nom du client ça peut être la date ça
00:01:39
peut être le numéro de la facture ce
00:01:41
genre de chose et enfin on a les données
00:01:42
dynamiques les données dynamiques ce
00:01:44
sont les données qui sont dans le
00:01:46
tableau les données qui vont être
00:01:47
variables par exemple si on veut une
00:01:49
colonne description on aura sur la
00:01:51
première ligne workflow parts sur la
00:01:53
deuxième ligne extraction de données 40
00:01:56
000 cellules et sur la troisième ligne
00:01:57
coaching et on réplique le même
00:01:59
processus sur la le prix unitaire et le
00:02:01
total net maintenant étant donné qu'on a
00:02:03
dit qu'on va utiliser Python pour faire
00:02:05
ce scrap de ce fichier PDF il va y avoir
00:02:08
quelques librairies à importer j'ai fait
00:02:11
la liste non en vrai il y en a que 4 on
00:02:13
a d'abord openix XL si vous souhaitez
00:02:15
importer votre résultat dans un fichier
00:02:18
Excel on a par la suite pandas qui va
00:02:21
nous aider à manipuler nos données et
00:02:23
aller mettre sous un format de tableau
00:02:24
on a après PDF plumber PDF plumber comme
00:02:27
son nom l'indique encore une fois c'est
00:02:29
ce qui va nous permettre d'extraire
00:02:31
notre fichier PDF extraire tout le texte
00:02:34
à l'intérieur et enfin en tant
00:02:36
qu'éditeur de texte j'ai pris Jupiter
00:02:38
Lab j'ai du coup copier coller mon
00:02:40
fichier PDF dans le même endroit que mon
00:02:42
notebook et la première chose que l'on
00:02:44
va faire c'est que l'on va importer
00:02:47
PDF plumber et la deuxième chose que
00:02:50
l'on va faire c'est que l'on va ouvrir
00:02:51
notre fichier PDF on va du coup taper
00:02:54
wave PDF plumber dot open on va noter le
00:02:59
chemin de notre fichier PDF pour ma part
00:03:02
je l'ai noté facture exemple point PDF
00:03:06
aspire et là on va mettre deux choses on
00:03:09
va noter la page que l'on veut extraire
00:03:11
dans notre cas c'est assez simple parce
00:03:13
qu'on a qu'une seule page néanmoins si
00:03:15
on avait plusieurs pages à extraire rien
00:03:17
ne nous aurait empêché de faire une
00:03:18
boucle et en deuxième lieu on va
00:03:20
extraire le texte de ces pages on va du
00:03:22
coup taper page
00:03:28
parce que c'est la première page et
00:03:31
après on aura le texte qui sera du coup
00:03:33
à partir de la page donc page dot
00:03:37
extract texte on va attendre un petit
00:03:40
peu voilà on a du coup la page avec
00:03:43
qu'une seule page et plus intéressant on
00:03:45
a le texte où on a l'entièreté du texte
00:03:48
on va commencer par les données
00:03:50
statiques et plus particulièrement sur
00:03:52
la date on va extraire en tout trois
00:03:54
données statiques la date le numéro de
00:03:57
facture et un petit peu plus compliqué
00:03:59
le client de ça jusqu'à là commençons
00:04:04
par la date alors déjà j'ai envie de
00:04:05
faire quelque chose d'un petit peu plus
00:04:06
visuel parce que vous voyez qu'ici deux
00:04:08
facto on a tout sur une seule ligne
00:04:10
ouais du coup faire quelque chose
00:04:12
forline in textot split et on va le
00:04:15
spliter sur un saut de ligne parce que
00:04:18
par défaut si on regarde bien il y avait
00:04:22
des backs la chaîne un peu partout ici
00:04:24
ici ici donc on va rendre la chose un
00:04:27
petit peu plus visuelle on va print la
00:04:30
ligne et voilà ce qu'on a de ce fait on
00:04:32
peut déjà déterminer avec un petit peu
00:04:34
plus d'aisance que la date est située en
00:04:37
dessous du texte date et ça ça ne
00:04:40
changera jamais mais alors comment
00:04:41
est-ce qu'on va faire pour extraire la
00:04:43
date à chaque fois qu'est ce qu'on va
00:04:45
faire on va du coup utiliser des RX on
00:04:48
va dire que on veut commencer par le mot
00:04:51
date sans pour autant sélectionner le
00:04:53
mot date en d'autres termes on va
00:04:55
utiliser ce qu'on appelle un positive
00:04:56
look behind oui j'ai un peu de culture
00:04:58
du coup je l'étale vous permettez que je
00:05:01
me la pète un peu merci et par la suite
00:05:04
on va dire qu'on veut sauter la ligne et
00:05:06
extraire la vraie date on va commencer
00:05:08
par importer nos rivex donc on va faire
00:05:12
une porte et on va d'abord écrire la
00:05:17
Redex avant de l'utiliser donc je vais
00:05:19
faire dattre est égal re dot comme pile
00:05:22
donc R2 compil ça qui nous permettent de
00:05:25
créer la relief de créer un pattern de
00:05:28
rigax on va insérer ici notre reggaix
00:05:30
qui sera du coup on l'a dit qu'il va
00:05:33
commencer par le mot date alors le
00:05:34
positive look behin ça commence par une
00:05:37
sorte de groupe on met un point
00:05:39
d'interrogation on met un signe
00:05:42
inférieur je crois son mais égal et on
00:05:45
met le texte donc ou notre règle de
00:05:47
manière générale mais ici c'est bel et
00:05:50
bien date et par la suite c'est pas
00:05:52
entièrement terminé on va mettre un bac
00:05:54
slash n pour dire qu'il y a un saut de
00:05:56
ligne et enfin on sélectionne tout donc
00:05:58
point plus on sélectionne toute la ligne
00:06:00
d'en dessous on ferme voilà on entre et
00:06:03
maintenant on va extraire la date à
00:06:05
partir de ça on va du coup taper date on
00:06:06
va partir sur ce qu'on a écrit et on va
00:06:09
utiliser point search R2 dot search qui
00:06:12
va nous permettre de chercher comme son
00:06:14
nom l'indique quelque chose là-dedans
00:06:16
qui répond à cette rigueix donc on va le
00:06:19
rechercher dans le texte par conséquent
00:06:21
et si on a perdu l'erreur ça veut dire
00:06:23
que déjà quelque chose a été trouvé ce
00:06:25
qui est une bonne nouvelle et
00:06:26
effectivement on a bel et bien la date
00:06:28
ici mais par défaut on a un objet re
00:06:31
d'autres matchs et moi idéalement
00:06:33
j'aimerais juste avoir le string ça veut
00:06:35
dire juste à voir balade enfin 29 04
00:06:39
2023 auquel cas on va chercher le groupe
00:06:42
on va mettre point groupe et ça commence
00:06:44
par 0 donc si je mets point groupe 0
00:06:47
j'obtiendrai le premier groupe donc
00:06:48
j'aurai cette donnée là on fait le test
00:06:50
et vous voyez qu'on appelle bien la date
00:06:53
on va faire la même chose sur la facture
00:06:55
donc on peut presque faire un
00:06:57
copier-coller on va l'appeler juste
00:06:59
facture et Red Hot compil et la seule
00:07:02
différence c'est que le texte c'est
00:07:04
numéro de facture et non pas date voici
00:07:07
et on va parler copier coller cette
00:07:11
ligne là on va l'appeler facture
00:07:14
ça se base sur facture
00:07:17
d'autres search toujours sur le texte le
00:07:20
groupe zéro et on va voir ce qu'il en
00:07:22
est on a bel et bien la facture on va
00:07:24
terminer par la dernière donnée statique
00:07:26
à savoir le client le client comme on
00:07:29
l'a dit ce sera un petit peu plus
00:07:30
compliqué étant donné qu'il est
00:07:33
répertorié sur plusieurs lignes mais le
00:07:34
principe reste le même c'est à dire que
00:07:36
le client est toujours situé entre ce
00:07:39
texte là donc un positif Luke behind et
00:07:42
le texte description donc un positive
00:07:45
look head c'est exactement la même chose
00:07:47
sauf que là on dit ça se termine par
00:07:49
description mais on ne va pas prendre le
00:07:52
texte description en compte vu qu'on a
00:07:54
dit que le principe restait le même on
00:07:56
va procéder de la même manière client
00:08:01
on commence par
00:08:03
ce texte donc on reste sur un positive
00:08:06
look behind
00:08:08
ici on va mettre un pax/n aussi mais là
00:08:12
étant donné qu'il y aura plusieurs
00:08:14
lignes on va mettre un groupe
00:08:18
on saute on sélectionne tout
00:08:22
donc on est ici et on va de nouveau
00:08:24
sauter une ligne et on va répliquer le
00:08:27
processus une ou plusieurs fois donc ça
00:08:30
va faire
00:08:31
tac tac tac tac tac et ça se termine par
00:08:36
description pour le positif look head
00:08:38
c'est à peu près le même principe à la
00:08:42
nuance près qu'on va pas mettre le signe
00:08:44
inférieur donc c'est point
00:08:45
d'interrogation égal et le texte
00:08:48
description
00:08:50
je pense que c'est bon de toute façon on
00:08:53
sera bientôt fixé et pareil on a du coup
00:08:56
le client on se base sur le client
00:08:59
search groupe 0 on a quelque chose on va
00:09:02
voir ce qu'on a on a Tintin et Milou
00:09:04
jusqu'à moule à gaufre impeccable mais
00:09:07
là étant donné qu'on a traduit la chose
00:09:09
en string on a littéralement le
00:09:11
backslash n comme étant du texte donc si
00:09:14
vraiment on veut nettoyer un peu les
00:09:15
données on peut dire qu'on va remplacer
00:09:17
le back/ N par un espace et par la suite
00:09:20
on peut faire un petit strip parce que
00:09:22
on aura un espace à la fin qui n'est pas
00:09:24
nécessaire donc on va faire client est
00:09:27
égal client d’autres place
00:09:31
par un espace
00:09:35
et pour un strip et si on regarde le
00:09:37
client maintenant on a quelque chose
00:09:39
d'un petit peu plus clean à présent on
00:09:42
va parler des données dynamiques c'est à
00:09:44
dire des données dans notre tableau ça
00:09:46
commence du coup à cette ligne là et ça
00:09:49
se termine juste là pour commencer on va
00:09:51
de nouveau écrire une reggae avec un r e
00:09:54
dot comme piles et par la suite on va
00:09:57
créer la boucle on va garder la boucle
00:09:58
comme tel et on va faire un
00:10:00
IF Candy chaîne pour faire en sorte
00:10:02
d'identifier uniquement les prestations
00:10:04
et exclure tout le reste on va commencer
00:10:06
par créer notre rigueix pour la regex on
00:10:10
va être le plus précis possible je vous
00:10:13
expliquerai pourquoi dans un instant on
00:10:14
va l'appeler pressreux pour prestation
00:10:16
et ça va faire erreur Dotcom pile et on
00:10:19
va prendre les éléments les uns à la
00:10:21
suite des autres qu'est-ce qui pourrait
00:10:22
distinguer la description ce qu'on peut
00:10:25
dire pour commencer c'est que ça
00:10:27
commence par une majuscule par une
00:10:30
lettre capitale on va créer un groupe
00:10:31
donc un groupe pour dire ça c'est la
00:10:34
description
00:10:35
et ça commence par A à Z et on va mettre
00:10:39
un point plus pour dire qu'on veut
00:10:41
sélectionner l'entièreté de la
00:10:42
description et non pas seulement la
00:10:44
première lettre on ferme on ferme les
00:10:46
guillemets aussi et maintenant on va
00:10:47
mettre la condition
00:10:48
if donc on va dire
00:10:51
if
00:10:52
presque
00:10:54
d'autres search line si on la trouve
00:10:57
dans la ligne on va print la line
00:11:02
et là évidemment ça ne fait pas beaucoup
00:11:03
de différence donc on va continuer et on
00:11:06
va dire comment est-ce qu'on va
00:11:07
sélectionner la quantité et là déjà il y
00:11:10
a un élément distinctif c'est que la
00:11:12
quantité c'est un chiffre alors comme
00:11:13
beaucoup d'autres choses mais surtout il
00:11:16
y a un espace avant et il y a un espace
00:11:18
après ici un espace là il y a un espace
00:11:20
là pareil donc quantité c'est 3 et même
00:11:23
là si jamais on prend en compte 40 000
00:11:25
cellules vous voyez qu'il y a certes un
00:11:26
espace après mais il n'y a pas d'espace
00:11:28
avant parce qu'il y a directement le
00:11:29
signal inférieur on va dire qu'il y a un
00:11:32
backslash S et on va de nouveau refaire
00:11:34
un groupe ou cette fois-ci on va dire
00:11:36
bac/d back/d plus et on va réenchaîner
00:11:39
avec un back/s et si je refais la chose
00:11:42
vous voyez que là c'est déjà beaucoup
00:11:43
plus précis parce qu'on a les trois
00:11:45
extractions les trois prestations et on
00:11:47
a également la dernière ligne parce que
00:11:48
effectivement on a ce qui est considéré
00:11:51
comme étant la description et un espace
00:11:53
293 et un autre espace donc on va de
00:11:57
nouveau devoir être encore plus précis
00:11:58
et on va sélectionner le prix le prix
00:12:01
qu'il a devrait faire la différence
00:12:03
parce que on a plusieurs chiffres une
00:12:06
virgule deux chiffres et un signe euros
00:12:09
donc on va de nouveau faire un groupe
00:12:10
pour dire ça c'est le prix on enchaîne
00:12:14
en disant qu'on veut un chiffre qu'on
00:12:15
veut une virgule on va mettre un escape
00:12:18
caractère parce qu'une virgule c'est un
00:12:20
caractère spécial et on va dire qu'on
00:12:22
veut sélectionner deux chiffres et enfin
00:12:24
alors ça je l'exure mais ça se termine
00:12:27
par un signe euro et cette fois-ci c'est
00:12:29
impeccable on a les trois prestations on
00:12:31
ne reste plus qu'à enchaîner sur la
00:12:32
suite et à sélectionner le tarif final
00:12:34
alors ça je pense que je peux faire un
00:12:36
simple copier-coller par ailleurs donc
00:12:37
ça ce sera le prix final
00:12:40
parfait ça ne change pas notre condition
00:12:42
est vérifiée maintenant on va utiliser
00:12:44
tous les différents groupes que l'on a
00:12:46
créé pour dire ceci est la description
00:12:48
ceci est la quantité ceci est le prix
00:12:51
etc le principe reste donc le même on va
00:12:54
commencer par la description donc la
00:12:55
description ça part de presse search on
00:13:00
va chercher sur la ligne et non pas sur
00:13:04
le texte cette fois-ci et on va faire
00:13:06
point groupe 1
00:13:09
on va print la description pour savoir
00:13:11
si on n'a pas fait d'erreur et on
00:13:13
appelle bien la description workflow UPA
00:13:15
c'est extraction de données coaching
00:13:16
donc on a fait le search sur la ligne
00:13:18
tout simplement parce qu'on voulait
00:13:19
trois données il y avait trois
00:13:20
prestations différentes c'était donc
00:13:22
logique de faire de cette façon et on a
00:13:24
fait un groupe 1 et non pas un groupe 0
00:13:25
parce que le groupe 0 c'est l'entièreté
00:13:28
de notre reggaix et auquel cas on aurait
00:13:30
eu l'entièreté de la ligne une fois
00:13:31
qu'on sait ça on va pouvoir faire la
00:13:34
même chose la même chose pour la
00:13:37
quantité
00:13:40
donc search line cette fois-ci c'est le
00:13:42
groupe 2 celui-là
00:13:45
on va print la quantité
00:13:48
on a bel et bien la quantité et on a bel
00:13:50
et bien le prix impeccable maintenant on
00:13:53
va devoir enregistrer tout ça dans une
00:13:55
liste donc on va l'appeler item mais il
00:13:58
se trouve que il faut toujours garder à
00:14:00
l'esprit qu'à la fin on veut quand même
00:14:01
un tableau donc un tableau avec un nom
00:14:03
de colonne avec des noms de colonnes et
00:14:06
sa raison pour laquelle on va utiliser
00:14:07
une autre librairie qui s'appelle name
00:14:10
toppall alors je serais bien incapable
00:14:11
de vous l'expliquer exhaustivement parce
00:14:13
que c'est la première fois où l'une des
00:14:15
premières fois que je l'utilise
00:14:16
néanmoins un M top hall c'est un tube
00:14:20
qui est nommé
00:14:24
voilà voilà et c'est non ce seront du
00:14:26
coup les noms de nos colonnes on va
00:14:28
taper from collections
00:14:31
impols
00:14:33
et juste au dessus on va déjà
00:14:36
identifier notre tube notre name topper
00:14:39
donc on va le mettre dans une variable
00:14:41
qu'on va appeler presta on va faire name
00:14:43
to Paul et on va uniquement insérer deux
00:14:45
paramètres le premier paramètre c'est le
00:14:47
nom de notre tube et le deuxième
00:14:49
paramètre ce sera le nom de nos colonnes
00:14:51
les noms tels qu'on le souhaite à la fin
00:14:53
par exemple je veux commencer par la
00:14:55
date je mets un espace c'est une
00:14:57
nouvelle colonne la facture un espace
00:14:58
client pas une virgule un espace
00:15:02
description on avait la quantité
00:15:06
le prix et le prix total
00:15:11
et par la suite on revient tout en bas
00:15:13
et cette fois-ci on va taper
00:15:16
items d'autres happn et on va utiliser
00:15:19
notre variable presta que l'on vient de
00:15:21
créer et on va insérer entre parenthèses
00:15:23
chacune des variables que l'on a créé
00:15:25
jusqu'à présent donc on avait la date on
00:15:27
avait la facture on avait le client on
00:15:31
avait la description la quantité le prix
00:15:34
et le prix total et si on lance la chose
00:15:38
qu'on regarde dans notre liste parfait
00:15:40
vous voyez qu'on a trois éléments 1 2 et
00:15:43
3 qui a bel et bien les données
00:15:45
statiques les données qui ne changent
00:15:46
pas pour la date la facture et le client
00:15:48
c'est toujours la même chose en revanche
00:15:50
ce qui change les données dynamiques les
00:15:52
données des tableaux ce sont tout ce
00:15:54
qu'il y a à partir de la description
00:15:55
jusqu'au prix total à présent tout ce
00:15:58
qui reste à faire c'est d'utiliser la
00:16:00
librairie pandas que l'on va importer
00:16:02
tout de suite et de ce fait on sera
00:16:04
capable d'enregistrer les résultats dans
00:16:07
un fichier Excel on va du coup faire une
00:16:09
porte
00:16:13
et à présent on va créer un Data frame
00:16:17
qu'on va appeler dief speedidot data
00:16:20
frame sur notre liste qui s'appelle
00:16:24
items et si on regarde on a bel et bien
00:16:26
nos trois lignes il reste plus du coup
00:16:29
que de faire 10 tout Excel ou tout CSV
00:16:34
si vous souhaitez le mettre en CSV on va
00:16:36
l'enregistrer sous le nom facture
00:16:40
.xl X et je vais pas mettre l'index donc
00:16:45
je vais mettre l'index est égal à false
00:16:47
blindex c'est tout simplement cette
00:16:48
partie là et si on jette un œil sur
00:16:50
notre fichier excel on a bel et bien les
00:16:53
bonnes données c'est la fin de cette
00:16:54
vidéo j'espère que ça vous a plu alors
00:16:56
évidemment dans cet exemple on a extrait
00:16:59
qu'une seule facture mais après libre à
00:17:01
vous d'extraire toute votre liste de
00:17:03
factures et de l'insérer dans le même
00:17:05
fichier excel okay il faudra simplement
00:17:08
retravailler un petit peu le script
00:17:10
j'espère néanmoins que grâce à cette
00:17:11
vidéo vous avez maintenant une base
00:17:13
solide pour commencer si vous souhaitez
00:17:15
me soutenir et me suivre vous pouvez
00:17:18
rejoindre mon canal télégram vous
00:17:19
abonner et mettre un like sous cette
00:17:21
vidéo et si vous souhaitez que je vous
00:17:23
suive dans votre webtrapping vous pouvez
00:17:25
me contacter directement via cette
00:17:27
adresse email je vous dis à la prochaine