Collecter les données d’un site en 30 secondes avec Google Sheets

NB : cet article demande quelques bases en HTML et en CSS, notamment sur les concepts de balise et de classes. Ces bases peuvent néanmoins s’acquérir très rapidement, notamment en consultant le site suivant.

Introduction

La digitalisation de la société et l’essor du e-commerce engendrent chez les webmarketeurs et les managers un besoin croissant d’accéder à l’information en temps réel. Il devient de plus en plus primordial d’être capable de consulter instantanément et sur de larges volumes des informations telles que les derniers tweets de telle ou telle entreprise, ou bien les prix de tel ou tel concurrent.

digital-crawl

C’est pourquoi le data crawling, ou collecte automatisée de données, connaît une popularité grandissante auprès des managers d’aujourd’hui. Vous pouvez notamment utiliser le data crawling et la méthode que nous allons aborder aujourd’hui pour faire du price monitoring de votre concurrence, mener très rapidement des audits SEO de sites web, être averti en temps réel de la publication d’offres d’emploi sur le site carrière d’une entreprise … les applications sont illimitées.

Au cours de ces dernières années, Google a fortement mis l’accent sur sa suite bureautique, et a réussi à séduire de plus en plus d’entreprises, non sans raisons. Cette stratégie culmine avec le récent lancement de GSuite, présenté comme un “ensemble d’applications intelligentes pour les entreprises ». Cette définition, quoique pompeuse, est tout à fait appropriée, dans la mesure où les applications de Google telles que Drive, Gmail ou encore Sheets se différencient de la concurrence de par leur faculté à se “connecter » au web, et à pouvoir interagir entre elles. Il est ainsi possible de crawler des données avec Sheets, de les stocker sur Drive, puis de les envoyer automatiquement par mail via Gmail.

Nous allons aujourd’hui nous concentrer sur la possibilité de crawler des données via Sheets, qui est l’équivalent SaaS par Google de Microsoft Excel.

1 – La fonction IMPORTXML

D’après le support de Google, la fonction IMPORTXML “importe des données depuis des types de données structurées tels que XML, HTML, CSV, TSV et des flux RSS et ATOM XML. »

Bien plus que cela, cette formule importe les données et les rafraîchit en live si leur valeur change sur la page que vous crawlez !

Sa syntaxe est la suivante : IMPORTXML("url", "requête_xpath")

Avec :

  • URL : adresse de la page à examiner, protocole inclus (http, https…)
  • requête_xpath : requête XPath à exécuter sur les données structurées.

Ne prenez pas peur, malgré son nom peu avenant, l’utilisation du XPath est assez simple à appréhender : c’est une sorte “d’adresse » qui permet de naviguer entre les éléments d’une page web. De plus, nous allons voir qu’il est très facile à obtenir.

2 – Les choses sérieuses commencent

Sans plus attendre, mettons en application ! Pour commencer, nous allons crawler le dernier article de la liste des articles “en continu » du Monde.

Retrouvez tous les exemples de cet article en cliquant ici : http://bit.ly/2n4Kx5m

Rendez-vous à l’adresse sur Google Drive, connectez vous à l’aide de votre compte Google, et créez une nouvelle Sheets (bouton bleu “Nouveau » > Sheets en haut à gauche de l’écran).

Maintenant que votre fichier de travail est ouvert, positionnez-vous dans la cellule A1. Pour que notre fonction IMPORTXML fonctionne, nous avons besoin de deux éléments : l’adresse de la page à visiter, et le XPath de l’élément à crawler.

Pour l’adresse, il s’agit de http://www.lemonde.fr, nous allons donc maintenant chercher le XPath.

Rendez-vous sur Le Monde, de préférence à l’aide de Google Chrome (ce tutoriel se basera sur ce navigateur, qui est le plus utilisé aujourd’hui). La liste des articles “en continu » est située à droite de l’image principale de la page.

  • Positionnez votre souris sur le premier lien de cette liste et effectuez un clic droit > Inspecter.

    digital-crawl-donnees

  • Le code HTML de la page s’affiche, et le code du lien est en surbrillance (en bleu).
  • Positionnez votre souris sur cette surbrillance bleue et effectuez un clic droit > Copy > Copy XPath.

    digital-crawl-donnees

  • Nous avons désormais tout ce dont nous avions besoin ! Retournez sur Google Sheets, positionnez-vous dans la case A1, et inscrivez-y la formule :
=IMPORTXML("http://www.lemonde.fr";"//*[@id='habillagepub']/div[1]/div/div[2]/div[1]/div[1]/ul[1]/li[1]/a")

NB : La partie //*[@id='habillagepub']/div[1]/div/div[2]/div[1]/div[1]/ul[1]/li[1]/acorrespond au XPath que vous avez copié dans votre presse-papier.

Appuyez sur entrée, et après une petite séquence de chargement, le résultat s’affiche : félicitations, vous avez crawlé vos premières données avec Google Sheets !

digital-crawl-donnees

Si vous obtenez une erreur, c’est très probablement car vous avez des guillemets dans votre XPath, et ceux-ci posent un problème avec les guillemets de la formule. Remplacez-les par des apostrophes et tout devrait marcher !

Exemple : [@id="habillagepub"] devient [@id='habillagepub']

3 – Allons plus loin

Comme vous l’aurez remarqué, nous n’avons crawlé que le dernier article de la liste. Il serait bien plus intéressant d’avoir la liste entière.

Ceci nécessite de jongler un peu avec le XPath. Vous aurez remarqué les numéros entre crochets dans celui-ci : ils signifient que nous sélectionnons l’élément qui porte ce numéro dans l’arborescence de la page. Par exemple, « div[2] » signifie que nous sélectionnons le 2e élément <div>.

En étudiant un peu le code, on remarque que tous les liens des articles “en continu » sont contenus dans des éléments <a>, eux-même contenus dans des éléments <li>. Or, si l’on regarde dans le XPath, nous y avons uniquement sélectionné le premier élément <li> :

//*[@id='habillagepub']/div[1]/div/div[2]/div[1]/div[1]/ul[1]/li[1]/a

Si nous voulons sélectionner tous les liens, il suffit donc de supprimer ce numéro, et IMPORTXML crawlera par défaut tous les éléments.

Essayons donc avec la formule suivante :

=IMPORTXML("http://www.lemonde.fr";"//*[@id='habillagepub']/div[1]/div/div[2]/div[1]/div[1]/ul[1]/li/a")

digital-crawl

Vous l’avez sans doute compris, lors de vos propres tentatives, les difficultés que vous rencontrerez seront principalement dues au XPath, qui est un outil peut-être compliqué à aborder à première vue, mais néanmoins très logique, et extrêmement puissant. Il est utilisé dans de très nombreux domaines et je ne peux que vous conseiller de vous documenter sur ses subtilités. Il est possible que vous ne réussissiez pas à obtenir le résultat souhaité du premier coup, il faudra alors essayer de l’obtenir en modifiant le XPath (ce qui peut s’avérer hardu au premier essai, j’en conviens).

Pour plus d’informations sur le XPath, c’est par ici : http://www.w3schools.com/xml/xpath_intro.asp.

4 – Allons encore plus loin

Imaginons que nous voulons récupérer la liste de tous les articles du blog Crème de la Crème et leur titre. La liste de tous les articles est assez facile à trouver, il suffit de se rendre sur le sitemap de Crème de la Crème(le fichier qui contient toutes les adresses du site, afin que Google puisse les indexer). Cependant, le titre de l’article est une information qui se trouve ailleurs, sur chacune des pages d’article. Nous allons donc devoir crawler cette information sur chacun des articles du blog.

Le fichier sitemap des posts de Crème de la Crème se situe à cette adresse. Nous allons donc tout d’abord crawler la liste de toutes les adresses d’articles à l’aide de la formule :

=importxml("http://blog.cremedelacreme.io/sitemap-posts.xml";"//*[local-name() ='url']/*[local-name() ='loc']")

digital-crawl

Puis, en observant le code d’une page d’article, on se rend compte que le titre est une balise <h1> portant la classe « post-title ». Autre force du XPath, nous allons donc crawler ces titres en les sélectionnant par classe :

=importxml(A1;"//h1[@class='post-title']")

Etendez la formule jusqu’au bas de la liste d’articles, et le tour est joué ! Si vous voulez crawler plusieurs informations distinctes sur la même page en une seule formule, c’est possible aussi avec IMPORTXML ! Vous n’avez qu’à inscrire plusieurs XPath à la suite en les séparant par une barre verticale « | ».

Par exemple, si vous voulez aussi, en plus de son titre, crawler les tags de chaque article, utilisez la formule suivante :

=importxml(A1;"//div[@class='tag-links']/a|//h1[@class='post-title']")

Cependant, ici les données s’affichent les unes en dessous des autres et nous empêchent d’étendre la formule. On utilisera donc la formule TRANSPOSE qui permet de transformer une colonne en ligne (et inversement), ce qui donne finalement la formule :

=transpose(importxml(A1;"//div[@class='tag-links']/a|//h1[@class='post-title']"))

5 – Repousser les limites

IMPORTXML est une fonction très puissante pour collecter les données du web. Comme nous l’avons vu, elle se base essentiellement sur le XPath, et il est primordial que vous vous documentiez un peu plus en détail à son sujet si vous souhaitez pouvoir crawler toutes les données que vous souhaitez.

Cette fonction fera le travail souhaité et vous donnera pleinement satisfaction dans la grande majorité des cas. Cependant, il faut lui reconnaître des limites, notamment en terme de vitesse de crawl sur les très grands volumes de données. Un simple copier-coller du XPath ne marchera pas toujours non plus, il faudra parfois le modifier un peu avec pour obtenir le résultat souhaité.

digital-crawl-tips

Il devient alors beaucoup plus intéressant de développer ses propres fonctions pour Google avec Sheets avec GScript, le langage de programmation de Google. Ce langage quasi-jumeau de Javascript vous permettra de développer des API et des applications très rapides pour Sheets, Drive, Doc, Gmail… à la manière des macros sur Excel.

Il devient alors notamment possible de manipuler en profondeur les données, de programmer des actions dans le temps, de créer dynamiquement des feuilles de calculs, voire même d’envoyer par mail leur résultat de manière automatique … ce que nous verrons dans un prochain article !

Source de ce bel article : cremedelacreme.io

Comments are Closed