Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Alors maintenant qu'on a défini notre plan d'attaque et qu'on sait un peu mieux lesfonctions qu'on va devoir créer pour notre programme, on va créer ce que j'appellele squelette du script. Ça va nous permettre de commencer sans trop rentrer dans le code,
00:00:12 :là encore, d'avoir une meilleure idée des fonctions qu'on va utiliser et notamment desparamètres qu'on va donner à ces fonctions pour définir déjà ce qu'on avait commencé à faireici. Par exemple pour cette fonction pour récupérer l'URL de la page, est-ce que pour
00:00:24 :récupérer l'URL de la page suivante on va donner à cette fonction directement le HTML sous formattexte, donc une chaîne de caractère, ou l'URL, là encore une chaîne de caractère, mais l'URL àpartir de laquelle on va aller extraire le HTML. Pourquoi ça a son importance ? Parce que là vous
00:00:41 :allez voir qu'on va avoir plusieurs fonctions qui vont travailler sur ce HTML et donc il s'agit dene pas répéter l'information. Si à chaque fois par exemple on donne la requête et qu'on recrée
00:00:51 :un objet BeautifulSoup ou Selectolax dans le cadre de l'utilisation de cette librairie pourremplacer BeautifulSoup, est-ce qu'on va recréer à chaque fois un objet auquel cas on pourraitimpacter les performances ? Donc ces décisions on va déjà un petit peu les prendre ici et c'est
00:01:04 :pour ça que j'ai envie de créer le corps du script et je vais également commencer avec les imports etl'utilisation du logger. Ça on l'avait fait dans la partie dans laquelle je présentais les outils
00:01:14 :qu'on va utiliser, donc je vais juste coller le code ici. On a donc l'import du HTML parser deSelectolax qu'on va utiliser à la place de BeautifulSoup, le logger de Loguru et le 6 iciqu'on va mettre d'ailleurs avant puisque c'est un module de la librairie standard et ça ce sont
00:01:29 :des modules que l'on a installés avec pip. On crée notre logger, on ajoute le logger dansbooks.log avec le niveau warning et la rotation sur 500 kilobytes et on va ajouter donc le logger
00:01:39 :également vers le terminal avec un niveau plus haut ici d'information. Donc on va retourner surnotre plan d'attaque ici et on va voir déjà quelle est la fonction qui sera un petit peu sivous voulez le point d'entrée de notre script. On va probablement faire une fonction main, là
00:01:53 :encore la fameuse fonction de point d'entrée avec la structure conditionnelle qui appellera ce pointd'entrée et dans cette fonction qu'est ce qu'on va faire ? Quelle est la première chose qu'on va
00:02:01 :faire ? Ça va être finalement je crois ce qu'on avait mis à plutôt à la fin c'est à dire unefonction pour récupérer les URL de tous les livres de la bibliothèque puisque ça c'est la premièrechose qu'on avait dit qu'on allait faire. Donc je vais le mettre ici dans ma fonction main, une
00:02:15 :fonction pour récupérer les URL de tous les livres de la bibliothèque et à partir de toutes cesURL on va pouvoir récupérer grâce à cette fonction donc fonction qui à partir de l'URL d'un livre vacalculer le prix. Donc cette fonction pour récupérer les URL de tous les livres de la
00:02:28 :bibliothèque elle va faire appel à d'autres fonctions notamment la fonction pour récupérerl'URL de la page suivante et la fonction pour récupérer les URL sur une page spécifique. Donc
00:02:37 :je vais les mettre ici je vais les rapprocher l'une de l'autre et je vais les mettre en fait à lasuite je vais les couper et les mettre ici alors je vais refaire je vais sortir ça en fait de mafonction main je vais mettre un passe c'est juste pour les avoir un petit peu plus en haut ici et
00:02:48 :je vais refaire une chaîne de caractère multiligne comme ça on les aura ici et ça je vais le déplacerici aussi. Donc on va commencer par ces trois fonctions et ensuite on terminera avec ces
00:02:57 :fonctions un peu plus spécifiques donc cette fonction qui à partir de l'URL va calculer leprix et les deux fonctions un peu plus utilitaires ici pour récupérer le prix et récupérer laquantité disponible. Donc dans l'ordre on a celle-ci la fonction en fait une des fonctions
00:03:10 :principales qui va récupérer les URL de tous les livres. Et là on arrive au moment préféré desdéveloppeurs c'est trouver des noms donc c'est souvent le plus difficile finalement comment onva appeler toutes ces fonctions. Donc je vais faire des fonctions avec des noms en anglais
00:03:23 :pour les docstring puisque je vais essayer de faire un script le plus propre possible je vaismettre des docstring des annotations de type etc les docstring je les ferai en français pour pastrop vous perdre mais normalement dans des scripts on fait tout en anglais après bon ça dépend bien
00:03:36 :sûr des équipes mais c'est une généralité qui est assez reconnue dans le monde du développementpeu importe votre langue on essaye de développer en anglais pour que ce soit le plus facilementpossible récupérable par n'importe quel développeur. Donc je vais faire des noms assez explicites qui
00:03:49 :vont être peut-être un peu long mais au moins on comprendra bien de quoi il s'agit. Donc on vacommencer par un verbe on va faire get et qu'est ce qu'on va récupérer ? Tout simplement les
00:03:56 :URL de tous les livres donc get all books books au pluriel parce qu'il va y en avoir plusieurs eturls aussi au pluriel puisqu'on va avoir plusieurs URL. Donc je vais mettre un pass pour l'instant
00:04:08 :comme je vous dis le but là n'est pas de coder les fonctions mais juste les noms les paramètreset peut-être on ira jusqu'à la docstring. Donc get all books URL là qu'est ce qu'on va faire dans
00:04:18 :cette fonction donc je vais mettre un commentaire une docstring ici donc récupère ici toutes lesURL des livres sur toutes les pages et à partir donc à partir c'est là qu'il va falloir réfléchirje pense que moi en fait dans ce cas là je vais juste lui donner une URL de départ donc on va
00:04:35 :donner l'URL du site l'URL de départ du site et à partir de là il va naviguer à la prochaine pagerécupérer toutes les URL etc. Donc l'URL ça va être un paramètre qui va être une chaîne de
00:04:45 :caractère et qu'est ce qu'on va retourner donc là encore j'utilise les annotations de type on varetourner une liste de chaîne de caractère alors là je vais importer depuis le module typingdepuis typing on va importer liste et on va attyper nos éléments avec cet élément donc liste et ça
00:05:01 :va être une liste de chaîne de caractère puisque les URL seront en toute logique également deschaînes de caractère. Et ensuite qu'est ce qu'on va faire alors là je vais continuer ma docstring
00:05:09 :en précisant ce que font les paramètres je vais utiliser les outils de PyCharm si je vais ici dansdocstring on va pouvoir choisir le style des docstrings donc je vais taper ici dans la barrede recherche les préférences docstring et donc ce n'est pas le site docstring c'est vraiment les
00:05:21 :documentation string ici et docstring format donc on est avec le restructuré de texte je vais lelaisser comme ça et en fait là comme j'ai déjà écrit quelque chose il ne va pas me les proposerce que vous pouvez faire c'est donc couper le texte que vous avez déjà écrit donc je vais revenir ici
00:05:36 :et si vous refaites vous voyez avec la touche entrée un retour à la ligne automatiquement ilva prendre la définition de votre fonction et remettre le bon formatage donc là on va avoirdeux points param le nom du paramètre deux points et non va indiquer ici à quoi correspond ce
00:05:50 :paramètre et on va faire pareil avec return pour expliquer en fait qu'est ce qu'on va retournerdonc là je remets mon texte ici et à partir du coup de l'url d'une url en fait on va mettred'une url donc qu'est ce qu'on va avoir ici et bien tout simplement l'url de départ et qu'est
00:06:04 :ce qu'on va retourner liste de toutes les url de toutes les pages de toutes les pages toutsimplement on va s'arrêter la liste de toutes les url de toutes les pages donc ça c'est lapremière fonction normalement on est bien ici on a un nom on a un paramètre donc à partir de
00:06:21 :cette url on va récupérer on va naviguer en fait et récupérer tout ce dont on a besoin on a uneannotation de type ici pour dire ce qu'on va retourner ça va nous permettre de vérifier danschaque utilisation après des fonctions et si on utilisait un type checker de vérifier que tout
00:06:34 :est bon et qu'on n'a pas fait d'erreurs et qu'on n'a pas de problèmes potentiels qui peuvent arriverparce qu'on n'a pas retourné la bonne chose et on a nos paramètres ici et je vais finir par unpaste pour l'instant et je vais reformater tout ça là encore vous allez me voir le faire très
00:06:46 :souvent option commande l sur mac sinon vous allez dans code pour retrouver le raccourci c'estreformat code ici et ça va faire des séparations pour tout ce qu'il faut entre vos docstring votrele corps de la fonction les autres fonctions etc donc ensuite qu'est ce qu'on a une fonction pour
00:07:00 :récupérer l'url de la page suivante donc ça ça va être assez facile on va l'appeler get next pageurl tout simplement et là comme je vous dis je pense que en fait je vais privilégier le pluspossible de partir en fait directement d'un objet html parser qui est l'objet de select allax qui
00:07:17 :va contenir déjà l'arbre qu'on va pouvoir traverser pour trouver les informations parce qu'en faitici donc dans get all books url je vais créer cet objet je vais le passer à cette fonction et jene veux pas le recréer à chaque fois pour ne pas ralentir le script donc là je vais faire un objet
00:07:32 :je vais appeler tree et je vais mettre la notation de type pour indiquer que ça va être un objet detype html parser et on va dire donc que ça retombe tout simplement ici une chaîne de caractère parceque ça va être une url unique donc ce n'est pas une liste d'url c'est juste une url on met la
00:07:47 :docstring donc les trois guillemets j'appuie sur entrée là j'ai automatiquement les paramètres quisont bien mis correctement et je vais dire tout simplement récupère l'url de la page suivanteà partir du html d'une page donnée voilà alors le paramètre tree ça va être un objet html parserde la page à chercher on va faire ça ou de la page à scraper de la page on va mettre tout
00:08:11 :simplement de la page et qu'est ce que ça retourne et bien ça retourne l'url de la page suivantelà encore je mets un passe on commence donc à avancer dans la structure donc récupérer à partirdu html ou de l'url ça on y a répondu on va pour l'instant se baser sur le html directement
00:08:28 :plutôt que de l'url puisque là en fait on va déjà récupérer dans cette fonction le html parseret donc on va le passer à notre fonction ici pour récupérer la page de l'url là encore tout çan'est pas coulé dans le béton bien sûr là c'est ça le but en fait de faire cette étape c'est de
00:08:43 :commencer à penser les choses mais après bien sûr ça peut bouger un petit peu par la suiteil n'y a pas de souci avec ça donc fonction pour récupérer les urls sur une page spécifique doncça je vais le mettre après on va continuer et là encore on peut l'appeler de façon très explicite
00:08:56 :get all books urls mais cette fois-ci on page et là encore on va passer un objet donc html parserpuisque je vais continuer avec cette même logique et qu'est ce qu'on va retourner donc all books urllà on retourne avec une liste de chaînes de caractères puisqu'on va avoir plusieurs url
00:09:12 :retourné sur chaque page et je vais mettre donc ma docstring ça va commencer à se répéter icialors get all books url on va dire donc récupère toutes les url des livres présents sur une pagele tree donc ça va être objet html parser de la page là encore et en retour on va retourner donc
00:09:33 :liste des url de tous les livres sur la page et encore une fois on met un passe donc je vaiscollapser un petit peu tout ça pour voir où on en est donc on a notre chaîne de caractère ici ona fait ces trois premières fonctions fonctions pour récupérer les url de tous les livres donc
00:09:48 :get all books url on pourrait rajouter in library ou un truc comme ça mais bon je ne vais pas nonplus faire des fonctions avec des noms de trois kilomètres donc get all books url fonction pourrécupérer l'url de la page suivante get next page url et fonction pour récupérer les url sur
00:10:03 :une page spécifique get all books url on page donc comme ça depuis ici on va pouvoir à partir decette url récupérer donc déjà appeler en fait get all books url et sur la page où on est ensuiterécupérer l'url de la page d'après naviguer vers la page d'après et refaire un appel à get all
00:10:19 :books etc pour construire petit à petit notre liste donc cette fonction en fait va utiliser ces deuxautres fonctions pour faire là ce dont elle a besoin mais là vous voyez que déjà on commenceà séparer les choses bien pour ne pas tout faire à l'intérieur d'une même fonction ça permet
00:10:33 :d'avoir des fonctions qui vont être plus faciles à tester qui vont faire une seule chose et uneseule chose bien plutôt que de faire au moins trois ou quatre choses en même temps et comme ça çava être donc plus facile et donc qu'est ce qui nous reste comme fonction on a ces trois autres
00:10:44 :fonctions ici donc là encore j'ai coupé tout ça et je vais le remettre à l'intérieur de ma chaînede caractère ici je vais même le déplacer un petit peu on va on va descendre un petit peu dansnotre script donc je descends ici je remets mes fonctions à créer donc fonction qui à partir de
00:10:58 :l'url d'un livre va calculer le prix donc on peut faire une fonction qu'on va appeler get book pricepar exemple from url alors là encore qu'est ce qu'on fait est ce qu'on prend l'url alors oui dansce cas ci ça va être l'url alors on n'est peut-être pas obligé de mettre from url là encore c'est une
00:11:13 :décision à prendre vu qu'on va mettre un paramètre url donc cette fonction elle va être appelée parune autre fonction qui va probablement être la fonction main dans laquelle en fait ici si vousvous souvenez bien on a dit qu'on allait déjà récupérer toutes les url et ensuite à partir de
00:11:28 :ces url on va récupérer les prix donc probablement qu'on va tout simplement faire une boucle for quiva appeler cette fonction autant de fois qu'il y a de livres pour lui passer l'url qu'on aurarécupéré au préalable dans cette fonction ici donc là on va passer une url dans ce cas ci on
00:11:42 :pourrait choisir dans la boucle ici de déjà créer un objet html parser dans mon cas je pense que jevais plutôt faire cette opération à l'intérieur de la fonction je veux juste passer l'url jeveux pas faire trop de logique dans cette fonction main donc je vais garder cette logique à
00:11:58 :l'intérieur de getbook price from url donc là comme je vous disais on n'est pas obligé de mettrefrom url finalement si on met un paramètre url ça fait un petit peu doublon donc je pense queje vais juste mettre getbook price et dire que ici on a en paramètre une url qui va être une
00:12:12 :chaîne de caractère et qu'est ce que ça va retourner dans ce cas ci ça va retourner un floatpuisque les prix peuvent être des nombres décimaux donc ça ne va pas être un nombre entier mais unfloat et je vais remettre encore une fois ma docstring pour expliquer ce que ça fait donc tout
00:12:25 :simplement récupère le prix d'un livre à partir de son url donc l'url ici ça va être url de lapage du livre et return ça va être le prix du livre tout simplement le prix du livre en faitle prix du livre multiplié on va être plus spécifique multiplié par le nombre de livres en
00:12:42 :stock parce que c'est pas juste le prix du livre là si on a un livre qui coûte 50 euros et qui ena 10 ça va être 500 euros du coup le prix total du coup je pourrais spécifier un petit peu getbookprice on pourrait dire getbook price based on quantity si on veut ça sera un petit peu plus
00:12:58 :un peu verbeux mais bon en tout cas c'est un peu plus clair comme ça directement de quoi à quoi vaservir cette fonction donc getbook price based on quantity ça c'est bon et ensuite on a dit si jeremonte là donc ça on l'a fait fonction pour récupérer le prix à partir du html là encore
00:13:14 :avoir peut-être qu'on va le séparer je j'hésite je sais peut-être quelque chose que je verrai plustard en fonction de la longueur du code mais là encore pour des questions de vu que c'estquelque chose qu'on va pouvoir probablement répéter et si on le testait tester de façonplus unitaire j'ai envie d'avoir une fonction en fait juste pour à partir du html donc de l'objet
00:13:35 :tree html parser donc cet objet ici qu'on va récupérer à partir de select all axe juste àpartir de ce prix vérifier qu'on peut à partir du html de notre page récupérer le prix est pareilpour la quantité donc je vais quand même faire des fonctions séparées pour ça on va faire une
00:13:49 :fonction qu'on va appeler extract cette fois ci pour bien signifier qu'on extrait des donnéesle données html le prix donc on va dire extract price from page et on va lui passer dans ce casci directement un objet html parser pourquoi là on passe pas l'url parce que l'url et le
00:14:06 :parser en fait on l'aura déjà ici dans cette fonction donc là encore comme je vais extrairele prix et la quantité je ne veux pas recréer un objet html parser à chaque fois donc là jevais récupérer cet objet html parser dans cette fonction et le passer à extract price et l'autre
00:14:21 :que je vais faire pour extraire la quantité et qu'est ce qu'on va retourner ici bah dans ce casci un float puisque le prix on l'a dit ça peut être un nombre décimal donc extract price frompage là encore on va mettre notre docstring extrait le prix du livre depuis le code html de
00:14:38 :la page donc tree ça va être un objet html parser de la page du livre et return on va retourner leprix unitaire du livre et ici on va mettre un pas et on va faire la même chose le même peut-êtrecopier on va voir peut-être qu'on pourra même faire une seule fonction pour les deux si ça se
00:14:54 :répète là encore on peut pas le savoir à l'avance mais si le code est presque le même peut-être qu'onpourra tout rassembler ça dans une fonction et juste avoir un paramètre qui change en fonctionde l'information qu'on souhaite récupérer là pour l'instant je préfère quand même bien séparer les
00:15:06 :choses plutôt que de passer par un paramètre c'est plus plus clair aussi comme ça faut juste voir àquel point le code va se répéter par la suite donc là on va dire extract donc qu'est ce qu'on vaextraire ici extract stock quantity from page donc la quantité de livres en stock et ici on va
00:15:24 :mettre là aussi on va modifier et on va dire extrait la quantité de livres en stock sur depuisle code html de la page le code html de la page là encore donc objet html de la page du livre etlà le nombre le nombre de livres en stock et là dans ce cas ci donc ça va pas être un float ça va
00:15:44 :être un int puisque on n'aura pas on ne peut pas avoir une moitié de livres en stock donc ça vaforcément être 0 1 2 etc donc des nombres entiers donc voilà normalement je pense qu'on a tout onva enlever cette chaîne de caractère ici qui ne sert plus à rien je refais un petit reformat et là
00:16:02 :normalement donc dans notre fonction main ici qu'est ce qu'on va faire on va prendre les allbooks url ça va être get all books url l'url de base je vais la mettre ici je vais l'appeler mêmebase url et ça va être donc l'url de la page d'accueil on va récupérer toutes les url à partir
00:16:21 :de cette url de base et ensuite on va dire pour each book on va mettre juste book pour book inall books url on va mettre book url du coup puisque ça va être une url là on va récupérer le pricequi va être égal à get price get book price based on quantity et là ouais c'est un peu je
00:16:39 :vais enlever le based on quantity parce qu'on a l'impression que là il va falloir lui passerla quantité alors qu'en fait on va juste récupérer le juste récupérer le book price je vais lelaisser comme ça je vais laisser get book price ça me semble plus clair là encore comme je vous
00:16:52 :dis les noms c'est vraiment la chose qui est peut-être la plus difficile à avoir de correctil n'y a pas de bonnes réponses et il faut essayer de coller le plus à la réalité doncget book price là on a dit que c'était justement depuis l'url donc book url donc vous voyez là on
00:17:05 :commence à faire la logique même si on n'a rien encore qui est fait dans les fonctions on vérifieque là on a bien la logique qui se met en place parce que là imaginez donc que j'aurais pu mettreautre chose en fait j'aurais pu mettre l'arbre comme je vous dis mais là ça veut dire qu'on
00:17:18 :aurait dû récupérer ici déjà le tree à partir de html parser donc ça peut être ça peut être unefaçon de faire mais là moi je préfère avoir le minimum de code ici et avoir après à chaque foisle code qui se passe à l'intérieur des fonctions donc là on a l'url donc ça fait du sens de passer
00:17:33 :l'url à cette fonction et de récupérer le prix et après qu'est ce qu'on peut faire on va mêmepeut-être pouvoir à la fin faire tout ça dans une compréhension de liste mais je pense que c'estbien aussi d'avoir une boucle pour que ce soit plus clair on peut dire total price est égal à 0
00:17:45 :ici faire un total price de plus égal price tout simplement et à la fin retourner total price etje pense que ça suffirait voilà pour récupérer le prix total de la librairie donc on a notre urlde base à partir de cette url on fait un get all books url on lui passe l'url de base là on va
00:18:02 :avoir une liste avec toutes les url de tous les livres de la bibliothèque on boucle dessus ondéfinit un prix de base qui est égal à zéro on boucle sur toutes les url on récupère le prix dulivre basé sur le prix du livre plus la multiplié par la quantité à partir de l'url du livre donc
00:18:18 :on va faire le scrapping dans cette fonction qui va utiliser ces deux autres fonctions pour extraireles données et ensuite on ajoute ce prix à cette variable on pourrait faire une liste aussi çapourrait être plus simple et un peu moins gourmand ressource de faire une liste plutôt que d'ajouter
00:18:32 :tout ça de faire total price point append price et ensuite de faire un retour de sum de total pricec'est une autre façon de faire vous voyez là encore il n'y a pas qu'une seule façon de faireles choses et je vais m'arrêter là pour cette partie on a fait déjà beaucoup de choses je
00:18:45 :pourrais aussi aller faire déjà le code aussi dans get all books url pour faire la logique sur papierde ce qu'on a dit qu'on voulait faire mais là je pense qu'en fait quand on va commencer à faireça on va vraiment commencer à mettre les mains dans le code et faire le code de chaque fonction
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.