Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Dans cet exercice, votre objectif va être de trouver les catégories de livres qui necontiennent pas suffisamment de livres, le but étant ici de permettre au libraire derenforcer ces catégories.
00:00:10 :Si on va voir par exemple en bas dans la liste, dans short stories, vous voyez qu'ici on aun seul livre alors que d'autres catégories comme par exemple musique en contiennent bienplus.
00:00:19 :Le but de cet exercice est donc de parcourir toutes les catégories qui se trouvent dansla barre de navigation ici à gauche et de vérifier le nombre de livres qui contiennentchaque catégorie.
00:00:28 :Vous devrez permettre avec votre script de définir un seuil, par exemple nous on vamettre 5 donc c'est à dire que notre script va nous retourner le nom de toutes les catégoriesqui contiennent moins de 5 livres et vous devrez être en mesure de changer ce seuilpour pouvoir ajuster et récupérer le nom des catégories qui contiennent en dessous
00:00:45 :d'un certain nombre de livres.Donc le but ça va être de passer à travers toutes ces catégories ici et de récupérerà chaque fois le nombre de livres et d'afficher cette information à l'écran.
00:00:54 :Le script devra également commencer de la page d'accueil c'est à dire que vousprendrez cette URL avec la page d'accueil qui contient les catégories à gauche etla première page de tous les livres et c'est à partir de cette page d'accueil que vousallez devoir récupérer les liens de toutes les catégories ainsi que les noms des catégories
00:01:11 :et ensuite récupérer sur chacune de ces pages ici donc naviguer vers chacune de cespages pour récupérer le nombre de livres et afficher un message dans le cas où lenombre de livres est inférieur ou égal au seuil que vous aurez défini.
00:01:22 :Si vous allez voir également les pages de certaines catégories vous verrez qu'on ades catégories qui contiennent beaucoup de livres et qui ont notamment une paginationdonc dans cet exercice en fait on va considérer un seuil en dessous de 20 donc on va considérerque le libraire va juste vouloir vérifier des catégories qui contiennent moins de 20
00:01:40 :livres donc ça va changer en fait votre façon d'aborder ce script je vous le dis par avancepuisque là par exemple pour une page comme ça on a 32 résultats.
00:01:48 :Ne commencez pas à essayer de faire de la navigation pour cet exercice on va juste seconsidérer sur des catégories qui contiennent moins de 20 éléments donc c'est à dire quepar exemple une catégorie qui aurait 19 éléments donc qui aurait une seule page d'affiché et quine serait pas donc remplie on aurait seulement 19 éléments sur les 20 possibles et bien c'est
00:02:06 :vraiment le cas le plus extrême qu'on va aller chercher. Essayez donc avec un seuil par exemplede 5 et 10 et retournez donc toutes les catégories qui ne contiennent pas suffisamment de livres doncen dessous de 20 livres donc 19 et moins. Donc voilà pour les indications bon courage et pour
00:02:21 :ceux qui souhaitent voir tout de suite la solution ou qui ont déjà réalisé l'exercice on continuetout de suite avec ma proposition de solution. Donc j'ai divisé mon écran en deux ici on se
00:02:30 :trouve d'un côté avec mon script donc un script très simple main.py et la page ici que je doisscraper. La première chose qu'on va devoir faire c'est donc récupérer les urls de toutes les
00:02:40 :catégories à partir de cette url de base. Alors ce qu'on va commencer par faire c'est importer leslibrairies dont on va avoir besoin donc on va avoir besoin de request pour effectuer des requêtesvers la page et récupérer le code html et on va utiliser beautiful soup pour récupérer le
00:02:55 :contenu de l'arbre du document object model pour pouvoir naviguer facilement à l'intérieur du html.Je vais faire également une fonction que je vais appeler tout simplement main pour l'instant onva mettre un pass dedans et avec PyCharm je peux mettre une condition ici très facilement en tapantjuste main et en appuyant pour valider avec entrée et ça va me mettre cette fameuse condition ici
00:03:15 :if name égale main qui va me permettre d'exécuter cette fonction uniquement quand je lance le script.Donc on va écrire tout notre code ici à l'intérieur de cette fonction main pour l'instant on ne va pasgérer les erreurs on va faire le script le plus simple possible et dans les prochains exercices
00:03:28 :vous verrez qu'on fera des scripts beaucoup plus avancés qui vont gérer tous les catégoriespossibles pour que le script ne s'arrête pas de fonctionner en cas de problème. Donc dans ce cas
00:03:36 :ci qu'est ce qu'il faut que je fasse je vais déjà commencer par analyser mon site ici donc la pagede base je vais copier l'url d'ailleurs et je vais la mettre dans une constante ici que je vaisappeler base url dans une chaîne de caractère et ici je vais tout simplement donc inspecter
00:03:49 :cette catégorie ici donc je vais faire un clic droit et faire inspect pour ouvrir les outilsde développement de chrome vous pouvez faire la même chose sur n'importe quel navigateur ouvrirles outils de développement et vous aurez sensiblement les mêmes ici moi j'utilise icichrome puisque c'est celui qui est le plus utilisé dans le monde. Donc on va se retrouver ici avec la
00:04:08 :catégorie sur laquelle j'ai cliqué et si on remonte un petit peu au dessus on a un ul avecune classe nav et nav list ici donc c'est ce qu'on va vouloir récupérer. Pour récupérer donc le html
00:04:18 :de cette page je vais faire une requête vers l'url que j'ai défini donc on va faire une requête qu'onva récupérer dans une variable response et on va utiliser le module request pour faire une requêteget vers cette url. On va ensuite faire un beautiful soup à partir du contenu de cette requête donc
00:04:34 :comme je vous dis là on ne va pas gérer les erreurs donc on pourrait faire un response.raceforstationpour lever une erreur en cas de problème là dans ce cas ci on va faire vraiment le plus simplepossible. Donc on va créer un objet soup donc une variable soup qui va être créée à partir de
00:04:48 :beautiful soup auquel on va passer le texte de la réponse donc response.text et pour leparser on va passer le parser html donc entre chaînes de caractère ici en deuxième argumentà beautiful soup. Donc ici on crée une nouvelle instance de beautiful soup avec le contenu et le
00:05:03 :parser. Je vais juste réduire un petit peu la police d'écriture pour qu'on puisse voir toutsur la même ligne comme ça ce sera plus simple pour vous pour suivre le code. Donc qu'est ce qu'on
00:05:11 :va faire ensuite et bien on va récupérer les éléments donc tous les liens qui se trouvent àl'intérieur de cette navigation. Donc on va avoir ici un premier lien qui est books qui correspond
00:05:20 :en fait tout simplement à la page d'accueil si je me trompe pas effectivement on se retrouveexactement avec la même page donc nous ce qui va nous intéresser c'est pas le premier lien maison va continuer un petit peu ici on a le index effectivement avec les books et ensuite on a
00:05:33 :un ul avec un autre li. Alors là je vais vous montrer une autre façon de sélectionner deséléments avec beautiful soup. On va pouvoir utiliser la méthode select à la place de la
00:05:43 :méthode find ou find all qu'on utilise généralement. Select c'est une méthode qui va nous permettre desélectionner des éléments grâce au css donc grâce aux identifiants css. Donc je vais vous montrer les
00:05:54 :deux façons de faire la première façon avec les méthodes classiques find et find all et ladeuxième façon avec le select. Donc la première façon de faire ça va être de faire un soup.find
00:06:04 :pour récupérer la barre de navigation donc cette catégorie ici donc on va récupérer l'élément ulavec les classes nav et nav list donc pour ça on fait un find de ul donc ça c'est le nom de labalise et pour les classes on va le spécifier dans le paramètre classe ici avec un tiré du bas
00:06:20 :puisqu'il ne faut pas que ça clash avec le nom classe qui est défini par piton donc ça c'estvraiment le nom du paramètre classe tiré du bas et on va lui passer l'élément qu'on souhaitechercher donc dans ce cas ci c'est les classes nav et nav list donc je mets un espace entre les deux
00:06:33 :on veut que cet élément ul est à la fois le nav et le nav list donc ces deux classes comme on lesretrouve ici et ensuite ce qu'on va faire et bien c'est qu'on va tout simplement récupérer tousles liens à l'intérieur de cette ul. Donc ce qu'on pourrait faire également puisque bien sûr il n'y a
00:06:46 :pas qu'une seule façon de faire c'est après ça en fait descendre un petit peu et cibler le li etensuite le ul et ensuite seulement les li à l'intérieur de ce ul donc descendre un petit peucomme ça pour éviter d'avoir le premier lien moi dans ce cas ci ce que je préfère faire c'est rester
00:07:00 :ici récupérer tous les liens et éviter juste le premier en considérant que le premier lien icic'est le lien de la page d'accueil. Donc ce que je vais faire c'est à partir de ce ul là on a fait
00:07:09 :un find donc on va avoir un seul élément on va avoir cet élément ici à partir de cet élémentunique on va faire un find all pour récupérer tous les liens donc on va tout simplement fairefind all et mettre entre guillemets le a qui correspond aux balises de lien donc là ça va
00:07:23 :nous retourner toutes les balises A donc la balise ici avec l'index et toutes les balises qui setrouvent à l'intérieur donc même si elles sont à l'intérieur d'autres balises comme ici le ul etle li ça va quand même descendre toute la structure pour retourner tous les liens qui sont à
00:07:36 :l'intérieur de ce ul donc on va récupérer comme ça tous les liens de toutes les catégories il suffiradonc d'exclure le premier lien ici pour ne pas avoir la page d'accueil. Donc ça c'est la première
00:07:45 :façon de faire vous voyez que ce n'est pas forcément la façon la plus simple on a deuxméthodes qui s'enchaînent ici on doit spécifier dans différents arguments donc en premier ici lenom de la balise et ensuite spécifier qu'on souhaite chercher la classe etc etc après on aun autre find all donc ça fait beaucoup de choses à la suite vous allez voir que la méthode
00:08:00 :alternative donc je vais mettre ici alternative ça va être d'utiliser les sélecteurs css doncon va utiliser select on a select et select one qui correspondent respectivement à find et àfind all ou plutôt l'inverse en fait on a select qui va être l'équivalent de find all puisqu'ilva sélectionner tous les éléments et select one qui va être l'équivalent de find qui va
00:08:20 :sélectionner juste le premier élément qui est trouvé. Si vous voulez voir une bonne référencepour le css vous avez ce site qui est très connu qui s'appelle w3schools.com et vous avez ici dans
00:08:30 :les css sélectors un tableau qui répertorie tous les sélecteurs que vous pouvez utiliser donc vousallez voir que c'est très détaillé il y en a beaucoup qu'on peut utiliser et on va pouvoirfaire ainsi tenir tout dans une seule ligne donc là vous voyez par exemple si on souhaite cibler
00:08:42 :un élément avec une classe on va juste mettre point et le nom de la classe si on souhaitesélectionner un élément qui a à la fois une classe et une autre on va mettre point name1 pointname2 comme ça tout coller et on a plein d'autres choses comme ça ici par exemple si on souhaite
00:08:55 :sélectionner un élément qui a une classe sur un élément spécifique comme un paragraphe on peutmettre le nom de l'élément et on peut mettre aussi le nom de l'élément point et le nom de la classedonc nous c'est ce qu'on va utiliser je vais fermer ça je vais le remettre ici à droite nous ce qu'on
00:09:07 :va utiliser dans ce select donc c'est pas le select one on va vouloir récupérer tous les liens donc onva juste faire un select et ce qu'on va faire ici c'est une seule chaîne de caractère on va direqu'on souhaite sélectionner l'élément ul donc comme on l'avait ici jusque là ça change pas
00:09:20 :grand chose et ensuite on va dire qu'on souhaite sélectionner l'élément qui a la classe nav etaussi la classe nav liste donc on les met les deux à la suite comme ça coller sans aucun espace doncon cherche un élément ul qui a à la fois la classe nav et la classe nav liste encore comme ici et
00:09:36 :ensuite ce qu'on va faire c'est un espace et dire qu'on souhaite récupérer tous les éléments àl'intérieur de cet élément qui a été trouvé donc juste un espace pour spécifier que à l'intérieurde cet élément on souhaite récupérer tous les liens peu importe leur niveau donc ça va pas être
00:09:49 :forcément juste le premier niveau si on souhaitait avoir juste le premier niveau il y a une façon dele faire ça va être avec un symbole plus grand que là vous voyez avec le symbole plus grand queça nous dit que ça va sélectionner tous les paragraphes dont le parent est le div nous ce
00:10:02 :qu'on veut ici ce n'est pas sélectionner uniquement les liens dont le parent est le ul on veutsélectionner vraiment tous les liens peu importe que les liens et comme parent directement le ul ouun autre parent qui est enfant du ul donc pour ça on met un espace et si on retourne voir notre
00:10:15 :référence ici vous allez voir ici on a le div espace p et on nous indique que ça va sélectionnertous les éléments p à l'intérieur de l'élément div donc finalement ces deux façons de faire sontassez équivalentes les débutants préfèrent généralement passer par find puisque c'estplus explicite on va spécifier explicitement ici qu'on cherche la classe alors qu'avec le select
00:10:33 :il faut connaître un peu plus le css et c'est peut-être moins évident de prime abord à quoiva correspondre cette chaîne de caractère ici mais vous allez voir qu'avec la pratiquegénéralement préfère utiliser select et utiliser nos connaissances en sélecteur css pour simplifierici finalement le code et tout faire avec select ou select one donc là on va avoir les catégories
00:10:52 :qu'on va récupérer je vais commenter cette ligne moi je vais passer par l'alternative ici et je vaisrécupérer toutes les catégories dans une variable catégorie donc pour l'instant on va pas aller plusloin on va juste faire un print de catégories et on va voir ce que ça donne donc je lance le
00:11:04 :script je fais un clic droit ici et je clique sur run main ça va créer automatiquement uneconfiguration et ça va m'afficher le contenu de toutes mes catégories donc là on voit qu'on abien une liste avec ici toutes les catégories qui sont à l'intérieur donc on a le lien avec
00:11:17 :l'attribut href le nom de la catégorie et on a donc toutes les informations dont on a besoin icipour pouvoir ensuite accéder à chaque page de ces catégories donc ce que je vais faire ici c'estune compréhension de liste pour récupérer directement toutes les urls donc pour ça je vais
00:11:30 :faire une boucle donc je vais déjà faire la boucle simple category for category in categories donclà pour l'instant on ne fait absolument rien on récupère l'élément sans le changer moi j'aimebien faire cette méthode pour ceux qui sont pas trop habitués aux compréhensions de liste çapermet de bien voir notre boucle ici avec les crochets et ensuite on va spécifier ce qu'on
00:11:46 :veut donc qu'est ce qu'on veut nous ici on veut l'attribut href donc je vais mettre des crochetscomme si on accédait à la valeur d'une clé d'un dictionnaire on pourrait également utiliser.get ici pour ne pas avoir d'erreur donc là c'est encore une fois exactement comme avec les
00:11:58 :dictionnaires donc moi je vais récupérer ainsi tous les liens et si je reviens ici je peux faireun print de categories relancer le script et vous allez voir que cette fois ci on va voir uniquementles liens de toutes les catégories je pourrais aller récupérer je crois le title aussi qui va
00:12:11 :m'afficher le nom alors là on n'a pas le title je vais aller voir en faisant un inspect qu'estce qu'on a d'autre sur ces catégories donc on a juste le lien ah oui c'est le texte qu'il faudraaller chercher en fait donc je peux faire catégorie .texte tout simplement et là si je
00:12:24 :relance on va voir cette fois ci le nom alors on a des n partout je vais faire un texte .strippour enlever les éléments au début et à la fin donc je relance et là on a bien le nom avec tousles éléments superflus qui ont été supprimés donc on retrouve bien books, travel, mystery,
00:12:39 :etc et nous comme on avait dit on va récupérer tous les éléments à part le premier vous voyezque l'on récupère books qui correspond au premier élément et on avait dit que c'était la pageaccueil et qu'on ne le voulait pas donc là ce qu'on peut faire c'est faire un categories et
00:12:52 :filtrer pour commencer à partir de 1 et aller jusqu'à la fin de la liste donc là on fait unsplice à l'intérieur de notre compréhension de liste pour récupérer les éléments uniquement àpartir du deuxième élément donc on met 1 ici si on mettait 0 on commencerait au début là on met 1
00:13:06 :et donc on évite le premier élément donc si je relance là on devrait commencer à travel et ona bien ici travel en premier je vais enlever le texte .strip puisque nous c'est pas ce qu'on
00:13:14 :veut on veut le lien et je relance pour vérifier et là on a bien le book travel 2 qui correspond àla première catégorie travel donc ça fonctionne parfaitement je vais renommer ma variable je vaisla rendre un peu plus explicite et on va l'appeler categories URL et ensuite ce qu'est ce qu'on va
00:13:28 :faire bien on va tout simplement naviguer à travers chacune de ces catégories donc je vaisfaire une boucle pour category URL in categories URL on va naviguer à travers ces catégories alorslà vous allez voir qu'il ya un petit souci c'est que ces URL ce sont des URL relatives c'est à
00:13:43 :dire qu'elles sont relatives à la page sur laquelle on se trouve donc la page d'index ici etdonc il va falloir les concaténer avec notre URL de base pour ça alors on peut faire bien sûr uneconcaténation simple c'est à dire enlever par exemple le index.html ici pour avoir juste l'URL
00:13:57 :du site et ensuite concaténer avec un plus ou avec une f-string donc il ya différentes façons deconcaténer des chaînes de caractère en python nous ce qu'on va faire c'est utiliser une bibliothèquequi est dans la bibliothèque standard de python qui nous permet de concaténer des chaînes decaractère qui correspondent à des URL donc ça va gérer beaucoup de choses en arrière-plan pour
00:14:15 :s'assurer qu'on va pas avoir de problème notamment on va pouvoir lui passer l'URL directement avec lenom ici du fichier index.html et ça ne va pas le rajouter donc ça va l'enlever et ça va bien
00:14:24 :concaténer avec la catégorie donc si on retourne voir ici dans notre run ça va avec le cataloguepardon catalogue category donc ça va bien enlever cet élément et ça va nous éviter de faire desmanipulations peut-être que vous de votre côté si vous ne connaissez pas cette librairie qu'on
00:14:38 :va utiliser tout de suite peut-être que vous l'avez fait directement en faisant des splitsdonc c'est possible bien entendu mais ça rajoute beaucoup de manipulations de chaînes de caractèrealors qu'on peut le faire directement avec cette librairie. Donc cette librairie en question c'est
00:14:49 :urllib.parse et on va importer à partir de ce module la fonction urljoin qui va nous permettrede faire cette concaténation entre différentes URL. Donc ce qu'on va faire ici c'est concaténer
00:15:01 :notre URL de base avec l'URL de la catégorie qu'on récupère dans notre boucle. Donc ce que je vaisfaire c'est créer une variable qui va s'appeler full URL et qui va être égale à urljoin et onva joindre donc notre URL avec catégorie URL. Je vais faire un print de full URL ici et vous
00:15:17 :allez voir qu'on aura bien l'URL complète donc si je reviens ici vous voyez comme je vous avaisdit qu'on a enlevé automatiquement le index.html et qu'on a une URL valide qui va nous permettre
00:15:26 :d'accéder à la page de chaque catégorie. Pour être encore plus explicite je pourrais l'appelerplutôt absolute URL puisque là on part d'une URL relative et on la rend absolue avec l'URL de basedu site. Donc qu'est ce qu'on va faire ensuite et bien une nouvelle requête vers cette page. Donc on
00:15:40 :va refaire une variable response avec un request.get vers cette URL absolue et on va récupérer làencore avec beautiful soup les éléments de cette page. Donc on va refaire un objet soup qui va être
00:15:51 :égal à beautiful soup de response.text et on remet le html.parseur pour récupérer le documentobject model dans notre objet soup ici. Donc qu'est ce qu'il nous reste à faire et bien maintenant on
00:16:03 :va récupérer les différents livres qui sont sur la page. Donc là on voit par exemple que pour lapremière catégorie on a 11 résultats. Alors là encore il y a différentes façons de faire comme
00:16:11 :d'habitude pas une seule façon de gérer les choses. On pourrait se baser sur ce résultat ici donc faireun clic droit inspect et voir ici qu'est ce qu'on a. Donc on a un form method, on a le page header,
00:16:22 :le 11 ici vous voyez qu'il est dans une balise strong mais on n'a pas grand chose d'identifiableautour. On a un formulaire mais j'imagine que les formulaires il y en a peut-être plusieurs. Vous
00:16:31 :voyez qu'on a un résultat sur 12 donc on a plein de formulaires dans la page donc ça va être unpetit peu difficile aussi de les cibler avec ça. Donc personnellement je trouve que cet élément ici
00:16:40 :n'est pas très facile à identifier. On pourrait bien sûr essayer de remonter un peu plus en avant,d'aller dans ce div mais là encore c'est des classes bootstrap si je ne me trompe pas et çapourrait très facilement changer si le site évolue. Donc moi je préfère passer sur autre chose c'est à
00:16:55 :dire tout simplement compter le nombre de livres qu'on a sur la page. Donc pour ça si on reprendnotre outil de sélection ici on va aller voir les cards qu'on a ici et on voit que chaque livresemble être contenu dans un article donc ça c'est bien c'est une bonne sémantique html. Donc un
00:17:09 :article avec une classe ProductPod et si je fais un search là dessus on voit qu'on a 12 matchs donclà on voit qu'on a 11 résultats et pourtant 12 matchs donc il y a une petite incohérence entreles deux. Donc je vais essayer de voir où se retrouve ce ProductPod ailleurs que pour les
00:17:24 :articles qui correspondent à des livres et là en fait non je vois qu'on a 1 sur 11 donc il y avaitpeut-être un petit problème de rafraîchissement je vais refaire un search et oui effectivement làon a bien 11 donc ça fonctionne parfaitement et donc on va pouvoir tout simplement cibler
00:17:37 :ces articles avec cette classe ProductPod pour vérifier combien de livres on a sur la page.Donc je vais faire ça tout de suite là encore différentes façons de faire on peut repasserpar le find all, chercher les valises articles et utiliser le class avec le tiré du bas ici
00:17:50 :donc le paramètre class pour vérifier les ProductPod. On peut aussi comme vous l'avez vudonc passer par le select pour récupérer tous les éléments qui sont des articles avec la classeProductPod. Donc moi comme je vous dis plus j'avance plus je préfère cette solution que je trouve
00:18:04 :moins verbeuse donc je vais supprimer et passer directement dans ce cas-ci par le soup.select.Donc là qu'est ce qu'on va faire ? On va récupérer tout ça dans une variable et il suffit de compter
00:18:13 :le nombre d'éléments qu'on a ici donc je peux faire un print de laine de books et ça va ainsim'afficher le nombre d'éléments qui ont été trouvés sur la page et donc le nombre de livres.
00:18:22 :Donc là je vais lancer mon script et on va voir ce que ça donne. On devrait voir lesnombres ici le premier devrait être égal à 11 donc ça semble bien fonctionner puisquecette première catégorie avait bien 11 livres et si je continue là on a 20 pour la deuxième
00:18:33 :donc je vais aller voir dans le mystery. Alors là on a 20 livres et on a 32 résultats donc notreméthode fonctionne à part le fait que quand on a plus que 20 résultats effectivement ça poseproblème dans le sens où si on mettait un seuil de 25 par exemple et bien là nous on dirait qu'il
00:18:48 :y a juste 20 livres alors qu'en fait il y en a 32. Donc c'est la limite de passer par cette façonde faire. Là moi je vais considérer que dans le cas de figure que je vous ai donné en fait le
00:18:57 :seuil va être assez bas donc va être en dessous de 20. On va chercher par exemple des catégoriesqui ont 5, 10 peut-être 15 livres maximum pour pouvoir rajouter plus de livres. Donc si vous
00:19:06 :voulez avoir un script qui fonctionne avec plus que 20 éléments donc avec un seuil au-delà de 20 ilfaudrait probablement ici passer par le result donc le nombre de résultats ici qui est plusexplicite ou alors naviguer sur les pages mais là ça me semble encore un peu plus compliqué je
00:19:20 :pense que le mieux ce sera de passer ici par le résultat. Donc moi je vais garder cette façonde faire ici avec un seuil qui va être inférieur à 20. Donc ce seuil d'ailleurs on va tout de suite
00:19:27 :le définir je vais faire un paramètre que je vais appeler threshold en bon français donc c'est unparamètre qui va signifier le seuil qu'on souhaite définir. Threshold signifiant seuil en anglais.
00:19:37 :Je vais mettre une valeur par défaut qui va être égale à 5 et je vais le définir ici aussi doncje vais dire dans le main que on va mettre 10 ici on va envoyer une autre valeur un peu plusgrande que celle qu'on a par défaut et on va pouvoir utiliser cette valeur ici pour vérifier
00:19:50 :les catégories qui n'ont pas assez de livres. Donc ce qu'on va faire ici c'est tout simplementune structure conditionnelle je vais faire une variable intermédiaire avant pour que ce soitbien explicite on va faire une variable numberOfBooks qui va être égale à l'n de books eton va faire donc if numberOfBooks est plus petit ou égal au threshold alors on va faire un print
00:20:08 :qui va indiquer que la catégorie ne contient pas assez de livres. Donc la seule chose qui nousreste à récupérer ici c'est le nom de la catégorie puisque pour l'instant on ne l'a pas récupéré donclà je vais essayer de trouver le nom de la catégorie on va faire un clic droit et un inspect
00:20:20 :sur le nom ici et là on voit qu'il est dans un h1 donc ça tombe bien les h1 normalement ils sontuniques sur la page et si je fais un search ici de ce tag h1 effectivement j'ai bien 1 sur 1 doncun seul résultat donc on va pouvoir utiliser ce h1 sur la page pour récupérer le titre de la
00:20:35 :catégorie donc je vais faire une variable catégorie title qui va être égale à soup.select et on vasélectionner un seul élément cette fois donc on va faire un select one et sélectionner le h1 et surcet élément on va sélectionner le texte tout simplement donc là on va faire dans notre string
00:20:51 :ici on va dire la catégorie et on va insérer le nom de la catégorie donc catégorie title necontient pas assez de livres et là on va insérer le nombre de livres entre parenthèses pour avoirun indicatif donc on va reprendre notre variable number of books et on termine par un point et je
00:21:07 :vais mettre des guillemets autour de la catégorie pour qu'on l'identifie bien ici comme ceci doncvoilà normalement on a tout ce qu'il faut on va essayer donc avec le threshold de 10 on va mettre15 même comme ça la première catégorie ne contiendra pas assez de livres donc je relance
00:21:21 :mon script en cliquant sur la petite flèche et là voilà on a bien la catégorie travel donc necontient pas assez de livres on en a 11 ensuite celle qui suit c'est philosophy donc si on vavoir mystery on en a 32, 26, 75 et effectivement philosophie on a 11 classique on a 19 donc c'est
00:21:37 :bon et donc ça semble bien fonctionner on a notre script qui nous affiche tout ce qu'il faut on vaessayer de changer le threshold ici là on était à 15 donc on a quand même pas mal de catégorieson va essayer avec juste une donc on va voir quelles catégories n'ont qu'un seul livre donc ça
00:21:52 :c'est vraiment des catégories qu'il va falloir renforcer et là vous voyez probablement que lescript n'est pas super rapide donc là comme on a beaucoup de requêtes comme ça à la suite avecla même session on va pouvoir utiliser justement un objet qu'on va appeler une session qui va
00:22:06 :éviter de refaire une requête à chaque fois donc ça c'est ça fait partie des optimisations que vouspouvez faire qui vont vraiment le plus grandement améliorer les performances de votre script donclà on voit qu'on a 2, 3, 4 catégories donc les catégories qui sont qui commencent à paranormal
00:22:21 :donc paranormal ici voilà et voilà là on a fini le script mais vous voyez que ça prend peut-êtreune petite minute pour passer à travers tous ces liens alors qu'il n'y en a pas énormément il y apeut-être une trentaine de catégories donc là ce qu'on va pouvoir faire pour terminer le script
00:22:33 :je vais enlever ce commentaire ici ce qu'on va faire c'est qu'on va faire une session donc onva faire avec un context manager une session avec request comme ça ça va éviter de créer unenouvelle requête à chaque fois on va garder la même session d'ouvert donc c'est un petit peu si
00:22:48 :vous voulez la même chose que si à la main en fait à chaque fois on fermait chrome on rouvraitchrome on fermait chrome etc vous êtes d'accord que ça prendrait beaucoup de temps à chaque foisde rouvrir le navigateur pour naviguer vers la page donc là ce qu'on va faire c'est avec un
00:23:00 :context manager créer un objet session à partir de request.session donc attention il y a bien unemajuscule ici c'est une instance donc on crée une instance en tant que session ici et toutsimplement à la place de faire un request ici et bien on va utiliser notre objet session donc
00:23:13 :je vais prendre tout ça je vais le décaler à l'intérieur de mon context manager et je vaisremplacer les request.get par session.get et on va descendre ici pareil avec ce request ici et
00:23:23 :là vous allez voir que ça devrait être beaucoup plus rapide on va mettre un else ici pour voiret pour afficher en fait en disant que la catégorie contient assez de livres et on va mettre le nom dela catégorie là encore comme ça on intègre catégorie title et on va mettre ça en f-string
00:23:40 :donc vous allez voir la différence entre les deux là je vais mettre un threshold on va mettre 5 jerelance le script et là vous allez voir que ça va assez vite ça défile et peut-être en on va direune petite dizaine de secondes voilà en une petite dizaine de secondes vous voyez qu'on est passé à
00:23:54 :travers tous les liens alors que si j'enlève donc si je commande cette ligne et qu'à la place dessessions je mets un request et on va enlever notre indentation vous allez voir que ça prend pas malplus de temps donc je relance et là c'est vraiment quelque chose qu'on peut voir à l'oeil nu donc ça
00:24:07 :vous montre vraiment la différence de rapidité là vous voyez pour passer à travers tout ça on vapeut-être mettre une trentaine de secondes par rapport à dix ou quinze secondes donc ça valittéralement deux à trois fois plus vite on pourrait faire des tests de performance maispar habitude je vous le dis vraiment c'est la première chose que vous pouvez faire si vous
00:24:23 :souhaitez grandement améliorer les performances de votre script donc vous voyez là on est peut-êtremême à 40 secondes pour passer à travers tout ça donc ça fait une grosse grosse différence doncje vais remettre ma session ici avec le context manager et voilà normalement donc ça fait letour on a bien récupéré donc le nom de la catégorie le nombre de livres et on a une indication
00:24:42 :à chaque fois qui nous indique si la catégorie contient assez de livres ou non avec cettestructure conditionnelle et le scrapping qu'on a fait de chaque page de la catégorie donc voilàpour cet exercice comme vous le voyez il y a plein de façons de le faire on peut utiliser des moyens
00:24:56 :un peu plus avancés ici comme le url join qui nous permet de nous faciliter la tâche mais onpourrait très bien le faire avec de la concaténation plus classique donc avec des f-strings etc et dela manipulation de chaînes de caractère pareil pour les sessions là encore c'est des choses un
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.