Emilien
4 min readApr 2, 2018

--

Augmenter la vitesse de Scraping avec Selenium et ChromeDriver de façon radicale

J’ai mis un temps fou à faire cette superbe image d’illustration qui n’a rien à voir avec le sujet abordé, soyez indulgents.

Scraper des données provenant pages statiques — c’est-à-dire sans contenu récupéré ou généré avec Javascript — est une chose plutôt rapide à comprendre et à exécuter. L’histoire se complexifie dès qu’il s’agit de récupérer des informations de pages dynamiques dont le contenu est généré avec JS. C’est à ce moment-là qu’on se tourne vers les solutions Firefox ou Chrome.

Vous connaissez déjà le principe du Scraping avec Selenium sinon vous ne seriez pas là à me lire. En revanche, il est peut-être nécessaire de préciser que l’exécution du JS couplé à l’affichage du CSS et des images n’est pas toujours pertinente. Et je ne parle même pas des publicités…

La solution qui nous vient alors en tête est d’intégrer un bloqueur de pub dans le processus de Scraping, ce qui parait être une bonne trouvaille, mais cela ne suffira pas. La plupart de ces addons alourdissant le lancement du navigateur à leur première exécution — et donc à chaque nouveau lancement — on se tournera vers une autre solution, et c’est là que j’interviens.

Par souci de lisibilité, mes exemples ne concerneront que ChromeDriver et Python. Vous trouverez un lien en fin d’article concernant Firefox.

Réduire le contenu au strict minimum

Si un affichage compréhensible des pages n’est pas vital, il est possible de s’en passer. Cela va nous permettre d’alléger les pages et réduire les temps de chargements. Allons droit au but : de quoi avons-nous besoin réellement ?

  • Le HTML pour récupérer les données
  • Le Javascript réduit à son strict minimum
  • rien d’autre…

C’est alors que vient la question du fonctionnement de ma réflexion. Après avoir écumé des heures durant le web à la recherche de solutions, j’ai fini par prendre le problème à l’envers : au lieu de bloquer les indésirables, je vais laisser passer uniquement les éléments souhaités.

Oubliez alors les options de ChromeDriver permettant de désactiver les paramètres inutiles. Vous savez, ces paramètres-ci :

profile.managed_default_content_settings.images
profile.default_content_setting_values.notifications
profile.managed_default_content_settings.plugins
profile.managed_default_content_settings.popups
profile.managed_default_content_settings.geolocation
profile.managed_default_content_settings.media_stream

Vous remarquerez qu’il n’est nullement fait mention d’une quelconque option permettant de désactiver la prise en charge du CSS. Google ne nous aidera pas beaucoup plus sur le sujet.

Bloquons-les tous !

En l’absence d’une solution, il nous faut alors la créer. L’idée est donc très simple : créer une sorte de “firewall” afin de bloquer toutes les requêtes entrantes et ne laisser passer que ce que nous souhaitons.

Il n’est pas possible de le faire directement dans le script, alors pourquoi ne pas créer une extension Chrome ! Ce n’est pas si compliqué.

Création d’une extension Chrome

Si vous n’en avez pas déjà pris connaissance, il existe une documentation complète qui vous aidera à débuter. Mais comme je suis sympa, je vais quand même détailler tout le processus.

Notre extension se compose au minimum de deux fichiers : manifest.json et background.js.

manifest.json

Je me suis permis d’y ajouter une petite icône pour faire beau, mais c’est facultatif.

La partie permissions est importante, c’est elle qui va définir où l’extension interagira et quelles sont les fonctions dont on doit autoriser l’utilisation.

background.js

C’est ici qu’on y met tout le code qui sera exécuté avant que chaque requête de Chrome n’aboutisse. C’est également ici que l’on va bloquer les requêtes et laisser passer celles qui sont nécessaires.

On laisse passer toutes les ressources de .monsupersite.fr

L’exemple ci-dessus va bloquer absolument toutes les requêtes dont l’url ne comprend pas .monsupersite.fr, laissant ainsi passer tout le reste.

Cependant, si dans le lot on laisse passer une ressource non désirée, on pourra créer une règle spécifique qu’on ajoutera juste avant le return :

De cette façon on peut créer une règle de blocage très large, ainsi que des cas particuliers.

On enregistre tout et on demande à Chrome de nous charger l’extension pour pouvoir la tester. Si ce n’est pas déjà le cas, pensez à activer le mode développeur dans l’écran des extensions.

Importez votre extension en cliquant sur Charger l’extension non empaquetée et sélectionnez le répertoire de votre extension.

Testez sur le site à scraper et vérifier que les autres sites sont bien bloqués.

Gain de productivité +500%

Apportez les modifications désirées et rechargez l’extension en la réactivant. Dans les détails de votre extension, vous pouvez accéder à la page d’arrière-plan afin de déboguer votre travail en toute tranquillité.

Empaquetage et exécution

Il ne reste plus qu’à générer un fichier .crx en cliquant sur Empaqueter l’extension à l’écran des extensions de Chrome, puis l’ajouter à votre projet.

Selon le langage utilisé, la méthode peut différer :

Cela va sans dire qu’il faut remplacer les placeholders avant de tester.

Cette méthode vous permettra de gagner jusqu’à 3 fois plus de temps dans le processus de scraping, ce qui n’est pas du luxe lorsque l’on a plusieurs centaines de pages à analyser.

Cela peut varier d’une exécution à l’autre, mais cette solution reste une excellente méthode pour vous débarrasser des chargements inutiles.

Si vous êtes plus team Firefox, voici un autre article sur la procédure à suivre.

Bon Scraping !

--

--