Optimisation de notre script avec les sessions
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Vous avez probablement remarqué quand on a lancé le script que ça prend pas mal de temps à exécuter.Si je regarde ici, on a terminé à 22h35 et si je remonte tout en haut, on va voir qu'on a commencé à 22h26.
00:00:10 :Donc on a à peu près 9 minutes pour extraire toutes ces URL et c'est assez long.Comme je vous avais dit, avec Selectolax, on va beaucoup plus vite qu'avec Beautiful Soup.
00:00:26 :Puisque là en fait, qu'est-ce qu'on fait actuellement ?On ouvre un nouveau navigateur si vous voulez à chaque fois.On fait une nouvelle connexion à chaque fois qu'on utilise le module Request.
00:00:35 :Donc dans le main ici, quand je vais récupérer toutes les URL avec cette fonction,quand je fais une requête ici, à chaque fois c'est exactement la même chose que si vous ouvriez Chrome,que vous vous rendiez sur la page et que vous fermiez Chrome, vous l'ouvrez de nouveau, etc.
00:00:51 :Donc ce n'est pas très pratique et pour ça on peut donc utiliser les sessions.Alors une session, on peut la créer avec ce qu'on appelle un Context Manager,le fameux With qu'on utilise par exemple pour ouvrir un fichier.
00:01:02 :Ça va avoir pour effet de fermer la session automatiquement une fois qu'on sort de cette structure.Donc ce que je vais faire, c'est à partir de Request.Session, on va créer une session en tant que session.
00:01:13 :Donc session comme ça avec deux S que je vais stocker dans cette variable.Donc c'est un objet, session ici, on met les parenthèses pour créer une instance qu'on récupère dans cette variable session.
00:01:23 :Et on va indenter toute notre boucle ici à l'intérieur de ce Context Manager.Et ici, il ne reste plus qu'à utiliser cet objet session à la place de Request.
00:01:32 :Et là en fait ce que ça va faire, c'est exactement comme si on ouvrait une seule fois un navigateuret qu'ensuite on naviguait d'une page à l'autre sans fermer le navigateur.
00:01:40 :Et vous allez voir que ça a énormément d'impact sur les performances, vous allez voir que ça va beaucoup plus vite.Je vais relancer le script et vous allez voir que là ça va très très vite, on va presque dix fois plus vite.
00:01:51 :Donc ça couplé au fait d'utiliser SelectAllAxes au lieu de BeautifulSoup,ça va vraiment grandement augmenter les performances de notre script.Là vous voyez qu'on repasse pour le GetBookPrice ici avec une session différente à chaque foiset on voit vraiment le ralentissement qui se fait.
00:02:05 :Donc ce que je vais faire c'est également le faire pour notre GetBookPrice.La différence avec le GetBookPrice c'est que c'est unitaire ici,en fait on a notre Request qui se fait dans la fonctionet donc on va avoir la boucle qui se fait dans notre Main ici.
00:02:20 :On a le GetBookPrice qui se fait à l'intérieur de cette boucle.Donc ce qu'on va faire c'est laisser le choix soit d'utiliser une requête à chaque fois,si on veut tester de façon unitaire par exemple cette fonction,soit lui passer un objet session, donc je vais le rajouter ici en paramètre,
00:02:32 :en indiquant que c'est un objet de type Request.Sessionet on va le mettre égal à None par défaut,puisqu'on souhaite permettre à quelqu'un, si cette variable n'est pas définie,de juste utiliser une requête normale.
00:02:44 :Donc là ce que je vais faire c'est vérifier est-ce qu'on a une session.Donc si on a un objet session qui a été passé,on va utiliser cette session à la place de Requestet sinon, donc on fait un Else, on va utiliser ce qu'on avait,c'est-à-dire tout simplement un Request.Get,
00:02:57 :donc Request comme ceci .GetURL.Et ce qu'on va faire c'est au niveau de la boucle,donc si je reviens dans mon Main ici,et bien on va encapsuler de nouveau notre boucle à l'intérieur d'un ContextManager.
00:03:08 :Donc on va faire WithRequest.Session,donc comme on l'a fait avec notre boucle While,on met tout ça à l'intérieur du ContextManageret là on va lui passer notre session,comme ceci, en argument.
00:03:18 :Et là vous allez voir que ça va aller vraiment,vraiment beaucoup plus vite,donc je vais le relancer et vous allez voirautant au niveau du Scrapping ici de toutes les pages,on fait tout ça presque en quelques secondes,là où avant ça prenait presque une minute.
00:03:30 :Et pareil ici vous voyez à quel point ça va beaucoup,beaucoup, beaucoup plus vite.Donc je vais le laisser tourner,vous allez voir combien de temps ça prend,donc comme je vous disais on était à 9 minutes sans les sessions,et là je pense que si on arrive à 1 ou 2 minutes,
00:03:41 :ce sera vraiment le maximum.Et voilà, donc 22h51 et 42 secondes,et si on revient au début on était à 22h49,donc ça a pris un peu moins de 3 minutes,si mes calculs sont bons.
00:03:52 :Donc vous voyez qu'on a un gros, gros gain de performance ici,bien sûr là on s'éloigne un petit peu d'un Scrapping,qu'on pourrait dire éthique,puisque ça va très vite,on pourrait encore améliorer tout ça,on pourrait faire des requêtes en synchrone,on pourrait lancer plusieurs threads,on pourrait utiliser d'autres outils
00:04:06 :qui feraient ça beaucoup plus facilement,pour nous également,mais là le but est quand même de rester raisonnable,ce qu'on pourrait faire pour rajouter un petit peu d'humain,c'est par exemple faire un time,time.sleep ici,
00:04:18 :avec un nombre aléatoire,on pourrait faire donc un nombre aléatoire avec uniformeentre 0,5 et 1,et là bien sûr je n'ai pas importé ces librairies,je vais les importer,et là ce que ça ferait c'est juste attendreun petit peu entre chaque requête,donc là vous allez me dire quel est l'intérêt
00:04:32 :si finalement on a augmenté les performances d'un côtépour les ralentir par la suite,il faut savoir que c'est toujours mieux quand mêmed'optimiser le script comme ceci avec les sessions,ça a un impact quand même moindre sur les performances,d'utiliser les sessions plutôt que de recréerun object request à chaque fois,
00:04:46 :et de toute façon c'est mieux d'avoir quelque chosequi est le plus rapide possible,et après vous, vous contrôlez en fait la rapiditéque vous souhaitez avoir,plutôt que d'avoir un script qui subitdes performances qui sont négligéesà cause d'un code qui n'est pas optimal.
00:04:59 :Donc moi je préfère comme ça optimiser mon codeen utilisant des outils comme SelectedAxe,en utilisant des sessions pour avoir le codele plus optimisé possible,qui consomme le moins de mémoireet qui est optimal en termes de rapidité,et après si je souhaite vraiment doser mon scrapping,et bien passer par un time.sleep comme ceci
00:05:16 :pour par exemple doser très précisémentle temps que je souhaite attendreentre chaque requête.Il y a d'autres choses qu'on peut faire aussipour ce script pour l'améliorer,bien sûr on pourrait utiliser un yieldet un générateur,donc à la place de tout stocker dans une liste,là pour l'instant on a 1000 URL,
00:05:29 :donc ce n'est pas encore trop,mais imaginez sur un site un peu plus grand,ça ne serait pas très efficace d'avoirtoutes ces URL dans une seule grosse liste.
00:05:36 :Donc il y a plein d'autres petites chosesqu'on peut faire,on peut toujours améliorer un script,c'est sûr,mais là au moins vous voyezqu'on a quelque chose qui est bien séparéavec une bonne gestion des erreurset qui permet d'avoir un aperçude comment notre script fonctionne.
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.