Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Dans cette partie, on va remonter un petit peu, on ne va pas faire encore cette fonction principaleGetAllBooksURL, on pourrait faire celle-là, GetNextPageURL et GetAllBooksURLOnPage.
00:00:10 :Je vais remonter dans l'ordre ici, on va prendre celle-ci, GetAllBooksURLOnPage.Donc on va lui passer un tree directement et on va récupérer toutes les URLs à partir de cette arbre.
00:00:19 :Donc si je viens par exemple sur la première page, sur cette page d'index, ce qu'on veut,c'est récupérer les URLs de tous les livres sur la page.
00:00:26 :Donc je vais prendre cette URL, je vais aller dans mon main,je vais remettre cette URL à la place de celle spécifique du livre que j'avaiset on va faire GetAllBooksURLOnPage.
00:00:35 :Et là, on va récupérer l'arbre en dehors de cette fonction à la différence de GetBookPriceparce que là en fait, on va créer cet arbre dans GetAllBooksURL,à chaque fois qu'on va naviguer sur la page, on va déjà avoir cet arbrepuisqu'on va l'utiliser à la fois pour GetNextPageURL et GetAllBooksURLOnPage.
00:00:52 :Donc là encore, on va éviter de recréer deux fois le même objet.Donc ce que je vais faire, c'est un tree à partir de HTML Parser.
00:00:59 :On va faire une requête avant, donc R égale request.get à partir de cette URLet là, je vais mettre R.text et on va passer cet arbre à notre fonction.
00:01:08 :Donc normalement, j'ai tout qui est bon ici.J'arrive là, je vais faire pour l'instant juste un print de treeet je vais lancer mon script pour vérifier qu'on a bien le HTML Parser.
00:01:17 :Donc ça fonctionne.Donc maintenant, si on retourne analyser notre page ici,je vais faire un clic droit, un inspect et on va voir où est-ce que se trouve ce lien.
00:01:26 :Donc ce lien, il se trouve ici.On a un href avec notre lien.Je vais vérifier s'il ne se retrouve pas à d'autres endroits de la page.
00:01:34 :Donc je vais copier l'URL et je vais voir cette URL s'il se trouve à d'autres endroits.Et effectivement, on a 1 sur 2.Donc elle se retrouve également ici dans l'image.
00:01:42 :Donc on a le image container et on a le h3 ici.Donc deux endroits à partir desquels on peut récupérer l'URL.C'est une URL relative comme vous le voyez.
00:01:50 :Donc il va falloir qu'on le gère pour pouvoir accéder à l'URL de la page.Parce que si je donne juste catalogue slash write in the atticet qu'on n'a pas le HTTPS, book to scrap, .com, etc.
00:02:00 :Bien sûr, notre requête ne va pas fonctionner.Il faut qu'on ait une URL complète.Donc on va voir comment gérer ce cas de figure.Et là, j'ai deux choix.
00:02:08 :Donc soit je vais dans le div image container, soit je pars du A ici.Alors là, on a une classe ici sur ce div.On a le href et ensuite à l'intérieur de ça, on a l'image.
00:02:21 :Et ok. Donc là, moi de voir, je pense que les h3,je vais voir aussi combien il y en a sur la page.Donc je vais faire une recherche des h3, des tags h3 et on en a 20.
00:02:30 :Donc ça correspond précisément au nombre de livres qu'on a sur la page.On a 20 livres sur chaque page.Donc je pourrais aussi partir du h3.
00:02:38 :Et je pense que je vais faire ça parce que le lien ici a plus d'informations.On a le titre notamment du livre.Donc ça peut être pratique pour d'autres choses.
00:02:46 :Et si jamais on a un problème et qu'on souhaite récupérer le titre du livrepour l'envoyer justement dans notre logger ou quelque chose comme ça,ça peut être pratique.
00:02:54 :Alors qu'ici, on ne l'a pas avec ce lien.On l'a dans le alt ici, mais on l'a dans le title directement sur le lien.Donc je vais passer par ça.
00:03:03 :Donc on va récupérer toutes les balises A,donc toutes les balises de lien qui sont à l'intérieur des balises h3.Donc on va déjà cibler les balises h3.
00:03:11 :Et vous allez voir que c'est très facile à faire avec SelectLaxgrâce à la syntaxe des sélecteurs CSS.Donc ce que je vais faire ici, c'est tree.css.
00:03:20 :Dans ce cas-ci, et pas css-first,puisqu'on va récupérer plusieurs informations,notamment 20 dans ce cas-ci.Donc 20 pour chaque page, puisqu'on a 20 livres par page.
00:03:28 :Donc css, c'est ce que je vais chercher déjà, les h3.Et à l'intérieur de ces h3, je vais chercher les éléments A.Donc si je retourne sur ma petite tête mémoire, sur W3School,si je descends, vous allez voir qu'il y a différentes façons de faire.
00:03:42 :On a cet élément ici, donc élément, élément,et élément avec le symbole plus grand qu'eux, et un autre élément.Donc ça, vous voyez, select all p elements inside div,et select all p elements where the parent is a div element.
00:03:55 :Donc c'est un petit peu différent.C'est-à-dire que là, si je fais h3 A comme ça,on va sélectionner tous les liens qu'il y a à l'intérieur des h3.
00:04:03 :Et si je fais avec un symbole plus grand qu'eux comme ça,on va récupérer tous les liens dont le parent direct est un h3.Donc c'est un petit peu différent, parce qu'imaginez qu'on aitd'autres choses à l'intérieur de ce h3.
00:04:15 :D'autres, par exemple, une liste, un div, etc.Ce qui n'est pas très conseillé d'ailleurs,d'avoir trop de choses à l'intérieur d'un h3,en termes de sémantique HTML.
00:04:25 :Donc si je mets juste le A comme ça,on va récupérer tous les liens qu'il y a à l'intérieur du h3.Si on met ça, ça va être juste les liens directs.
00:04:32 :Moi je vais mettre ça, je pense que là dans ce cas-ci,ça ne change pas grand-chose, puisque si je retourne faire un inspectsur le lien ici, je crois qu'on avait vraiment juste le lien à l'intérieur du h3.
00:04:41 :Donc dans ce cas-ci, ça ne change pas grand-chose.Pour vous montrer, je vais faire les deux.Vous allez voir que normalement, on devrait avoir la même chose.
00:04:47 :Donc je vais faire un print de la longueur de tout ça.Je lance mon script, et là on devrait avoir 20, ça fonctionne.Et si j'enlève le symbole plus grand qu'eux, on a 20 également.
00:04:56 :Donc vous voyez, dans ce cas-ci, il n'y a pas vraiment de changementavec l'un ou l'autre, donc je vais y aller au plus simpleet faire juste h3A, ou si je veux blinder mon scriptpour être sûr que ce soit juste les liens directs,si jamais la structure du html change et qu'on a d'autres choses par la suite
00:05:09 :à l'intérieur du A, avec d'autres liens notamment,peut-être, ce sera un petit peu bizarre, mais bon, je peux le spécifier comme ça.Donc là, je vais récupérer toutes les nodes,donc je vais mettre books, links, nodes, avec des S partout.
00:05:24 :Et ici, si je fais un print de tout ça, vous allez voir qu'on a des nœuds,donc c'est node A, et nous, ce qu'on va devoir récupérer ici,c'est l'attribut href de ces nœuds.
00:05:34 :Si je prends par exemple le premier avec crochet 0,on a un attribut qui s'appelle attributes, qui porte bien son nom justement,qui va correspondre à tous les attributs qu'il y a sur cet élément.
00:05:44 :Donc là, on voit qu'on a un dictionnaire tout simple, avec href qui est égal au lien,et on avait le title également qui est égal au titre.
00:05:50 :Donc là, je peux faire un crochet href ou un .get,là encore, la même chose avec les dictionnaires.Le .get ne nous retourne pas d'erreur si jamais il y a un problème,
00:05:58 :donc moi, je vais mettre ici les crochets, puisqu'on va refaire un try-exceptavec une gestion des erreurs en cas de problème.Donc je préfère là encore provoquer l'erreur, s'il y en a une,en mettant les crochets pour qu'on ait dans ce cas-ci,alors avec les crochets, ça va être un key error, si je ne me trompe pas,
00:06:12 :puisqu'on n'aura pas de clé href, si jamais sur un lien, il n'y a pas cet attribut href,on ne pourra pas y accéder, et comme c'est un dictionnaire ici,ce sera un key error.
00:06:20 :Donc je vais faire ça, sauf qu'il faut que je le fasse pour tous les liens.Là, j'ai pris le premier avec crochet 0,mais moi, je vais récupérer ça sur tous les liens.
00:06:27 :Donc là, on va faire une petite compréhension de liste,que vous aimez tant.Pour récupérer tout ça, on pourrait faire une boucle normale,mais une compréhension de liste, ça sera plus rapide.
00:06:36 :Donc là, on va faire le plus simple, comme d'habitude,on va dire pour link in book links node,et qu'est-ce qu'on récupère ? Pour l'instant, on va mettre juste le link.
00:06:44 :Donc si je fais ça, ça ne va absolument rien changer,je vais faire une variable que je vais appeler url,et là, si je print url, ici, on n'aura encore une fois que les nodes.
00:06:51 :Donc pour l'instant, je n'ai rien changé,comme je vous l'ai dit, j'aime bien faire ça,pour que ce soit clair qu'est-ce qu'on a au début,on a juste la boucle normale.
00:06:59 :Et qu'est-ce qu'on va faire maintenant ?On va vouloir concaténer, comme je vous avais dit,l'url relatif avec l'url absolu.Donc ça, on l'avait vu dans un exercice précédent,on va utiliser pour ça une bibliothèque de la librairie standardqui s'appelle urljoin,qui est disponible dans urllib.parse.
00:07:13 :On va importer urljoin,et ça, ça va me permettre de joindre l'url de base,donc l'url de base du site ici,avec l'url relatif, et ça va s'occuperde toutes les petites particularités qu'il peut y avoiravec des urls.
00:07:25 :Donc je vais utiliser ça, et là, à la place de link,je vais utiliser mon url de base.Alors je pense que celle-là, je vais la mettre dans une constante.
00:07:31 :On verra par la suiteest-ce qu'on la passe à cette fonction ou pas,est-ce que ça change. Pour l'instant,je pense que je vais y aller avec leflux de ma pensée, c'est-à-dire qu'on vapartir de cette page. Je pense qu'après,
00:07:43 :il faudra peut-être la modifier en fonction des pages.Mais pour l'instant, je vais mettre cette url dans une constante,parce qu'on va peut-être l'utiliserà plusieurs endroits.
00:07:51 :Je vais l'appeler baseUrl, et on va mettrepas tout l'url,on va juste garder la chaînede caractère. Et je vais m'en servirpour joindre tout ça ici.
00:08:01 :Je vais faire urlJoinde baseUrl avec linkpour link inbooklinksNode. Et là,ça va être un peu plus spécifique que ça, parce que link,on l'a vu quand j'ai lancé le script,ici, c'est un objet ne. Donc nous,
00:08:15 :on veut récupérer l'attribut href, donc je vais faire.attributes ici, et récupérersur cet attribut, avec les crochets,l'attribut href. Donc,normalement, je pense qu'on a tout ici.
00:08:25 :Je vais laisser çacomme ça, un print de url, et là,on a urlIsNotDefined, alorsqu'est-ce que j'ai fait ? J'ai dû oublier quelque chose.
00:08:33 :Ah oui, j'ai oublié le... Voilà. Là, on va mettrebaseUrl ici.Je relance, et là, on a bienles urls complètes, et non plus relatives,puisqu'il a concaténé l'urlde base avec l'url relativedu livre. Donc ça fonctionne, et si
00:08:47 :je souhaite éviter cette erreur ici,avec les crochets, je peux, donc,comme on l'a vu, soit mettre un .get,le problème du get, c'est que, en fait, ça va meretourner non, donc si je mets .get et qu'il n'y a
00:08:57 :pas de href, ici,on aura un objet non, et moi, je veux pas avoirun objet non, je veux vraiment êtresûr d'avoir des urls ici.
00:09:05 :Je pourrais mettre une valeur par défaut, mais là encore, j'aipas vraiment de valeur par défaut à mettre. Donc, ce queje vais faire, c'est plutôt laisser les crochets,et vérifier si on a lehref dans attributes. Donc, pour
00:09:15 :ça, je peux rajouter un if àla fin de ma compréhension de liste, ça va commencerà faire une compréhension de liste un petit peu longue, mais c'est pastrès grave, et on peut dire, donc,qu'on va faire ça uniquement si on ahref in link.attribute.
00:09:27 :Donc, dans ce dictionnaire link.attribute,si on a une clé href,donc si on a une paire clé-valeur avec cetteclé href, puisque par défaut,on pourrait mettre .keys ici, mais on n'est
00:09:37 :pas obligé, par défaut, il va chercher dans les clés.Donc, si on a ce href dans les clés denotre dictionnaire d'attribut associé au lien,eh bien, on peut le récupérer. Sinon,
00:09:45 :là, ça veut dire qu'on ne va mêmepas avoir un none. Donc là, si on aune url qui ne contient pas d'attributhref, on va juste continuerà la prochaine itération, on n'a pas deelse ici, donc c'est juste un if,donc on ne va rien récupérer, et ça évite
00:09:59 :de se retrouver avec des urls qui sont des noneou des valeurs par défaut.Donc là, je relance, là, normalement, tout fonctionneet ça n'a rien changé, mais voilà, c'est juste pouréviter les erreurs ici,et il y a peut-être d'autres erreurs qu'on n'a pas vues,alors dans ce cas-là, on ne peut pas non plus tout
00:10:13 :prévoir, donc ce qu'on peut faire ici, si jamaison n'est pas sûr et qu'on veut quand mêmelogger les erreurs, on peut faire un exceptde exception, qui est l'erreurde base, en python,as e, encore une fois, puisqu'on va la récupérer,et là, on peut logger cette erreur avec notre
00:10:27 :logger et dire, par exemple, une erreurgénérique, donc erreur lors del'extraction des urls,des livres, et on va intégrerici notre message d'erreur avec notref-string. Et là, qu'est-ce qu'on va faire ?
00:10:39 :Si jamais on a une erreur, et bien on va retournertout simplement une liste vide,et là, ici, je vais retournerles urls, hop, je vais retourner tout simplementdirectement cette compréhension de liste.
00:10:49 :Donc, soit, voilà, on arrive à récupérerles choses ici, normalement, comme jevous dis, il ne devrait pas y avoir trop de problèmes,si jamais ici, on n'a riendans tree.css, imaginez
00:10:59 :là, je mets un h4, on va tester,si je mets un h4, je ne crois pas quej'ai de h4 avec des liens dedans, on va voir,peut-être, mais si on n'a rien ici,le sélecteur css nene retourne rien, si je ne me trompe pas,on aura une liste vide, et donc, on va pouvoir
00:11:13 :itérer dessus avec notre compréhensionde liste, c'est juste qu'on va itérer sur une liste qui ne contient rien.Donc, on n'aura pas d'erreur, mais on aura juste une listevide. Donc, je relance, et
00:11:21 :là, effectivement, on n'a pas d'erreur.Je vais mettre n'importe quoi, quand même, pour être sûrqu'on n'a pas des h4 ou quoi.Donc là, on n'a pas d'erreur,ça fonctionne bien, c'est juste qu'on n'a pas de lien,mais si on a la bonne chose avec le h3,on a ce qu'il faut ici, et si jamais
00:11:35 :on a une erreur quelconque qu'on n'a pas prévue,eh bien, on va la logger, et on vajuste retourner une liste vide, là encore, pour pouvoircontinuer notre extraction, puisque là, onretourne une liste de chaîne de caractère.
00:11:45 :Donc, soit ça fonctionne et on retourne cette listede lien, soit on retourne une liste vide,et on va juste, dans notre fonction principaleici, getAllBooksURL, on vajuste arriver sur une page, il y aurait un problème,on va le logger, et on va itérer sur une listequi sera vide, donc on va récupérer aucun
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.