Published on

Comment scraper Google en Node.js ?

Voici comment mettre en place la récupération d'informations sur internet, en automatisant le tout pour jouer le script régulièrement. Avant de commencer à expliquer comment cela fonctionne et ce qu'il faut pour réaliser le scrapeur il est important de comprendre que cela peut être répréhensible, le vol de contenu est un des fléaux pour les éditeurs de contenus aujourd'hui.

La meilleure façon d'utiliser le scraping est d'utiliser les données que vous allez collecter dans le but de produire de la valeur ajoutée sur votre site ou à travers des outils. Un exemple très simple est de récupérer la météo pour adapté les produits sur une page d'accueil d'un site e-commerce qui vend des vêtements, le fait d'aller récupérer les données météo permet d'ajouter une fonctionnalité très intéressante pour un site de vente en ligne.

Présentation du projet

Récupérer les résultats de recherche sur Google pour une requête définie. Cet exemple n'est pas choisi au hasard, nous allons voir qu'il est possible de récupérer les résultats de plusieurs façons différentes et qu'il existe également des protections qui empêchent de récupérer des données à grande échelle.

Pour cet exemple nous allons récupérer le titre des pages, leurs liens, ainsi que la description des 10 premiers résultats dans Google. Nous verrons également qu'il est possible de récupérer les 100 premiers résultats assez facilement et comment industrialiser la récupération des données sur plusieurs requêtes.

Pré-requis

Comme l'indique le titre de cet article, je vais réaliser mon exemple avec Node.js, vous devez avoir donc d'installer sur votre machine Node avec une version récente. Si cela n'est pas le cas, vous pouvez vous rendre sur notre guide d'installation de Node avec une gestion multiple de versions sur une même machine.

Pour réaliser ce projet, j'ai utilisé la librairie cheerio pour avoir une interface de requêtage sur la page que je vais récupérer. Cela ressemble très fortement à du jQuery au niveau des sélecteurs. Si vous ne connaissez pas jQuery, vous allez vous rendre compte que cela n'est pas très compliqué pour des sélecteurs simples, si vous voulez aller plus loin il vous suffit de regarder autour de jQuery.

Récupérer les premiers résultats

Initialiser un nouveau projet avec NPM

On va commencer par créer un nouveau projet en ligne de commande via NPM, cela va initialiser un nouveau dossier avec un packakes.json qui va nous permettre de gérer les librairies dans notre projet.

mkdir google-results
cd google-results
npm init

Installer les paquets nécessaire pour le projet

npm i cheerio request

Créer le fichier de travail

Je vais travailler dans un fichier que je nomme index.js, il est possible de l'appeler comme vous souhaitez cela ne pose pas de problème particulier.

touch index.js

Écrire la première version du scraper

Nous avons tout ce qu'il faut pour réaliser notre projet, voici comment faire concrètement pour récupérer des résultats sur Google et les afficher dans notre terminal, en utilisant cheerio, les sélecteurs à disposition en prévenance d'une requête.

touch index.js
const request = require('request')
const cheerio = require('cheerio')

const getResults = async ({ keyword }) => {
  return new Promise((resolve, reject) => {
    request(
      {
        method: 'GET',
        uri: `https://www.google.fr/search?q=${keyword}`,
      },
      function (error, response, body) {
        try {
          const $ = cheerio.load(body)

          const links = $('a')
          let results = []
          links.map((i, el) => {
            let title = $(el).find('h3').text()
            if (title !== '') {
              const urlParams = new URLSearchParams($(el).find('h3').parent('a').attr('href'))
              const url = urlParams.get('/url?q')

              results.push({
                title,
                url,
              })
            }
          })

          resolve(results)
        } catch (e) {
          resolve(null)
        }
      }
    )
  })
}

const main = async () => {
  const results = await getResults({ keyword: 'bitcoin' })
  console.log(results)
}

main()

Si je lance mon script avec un node index.js, voici le resultat dans ma console :

➜  google-results node index.js
[
  {
    title: 'Bitcoin - Argent P2P libre et ouvert',
    url: 'https://bitcoin.org/fr/'
  },
  {
    title: 'Bitcoin — Wikip�dia',
    url: 'https://fr.wikipedia.org/wiki/Bitcoin'
  },
  {
    title: 'bitcoin.fr - Actualit� du bitcoin en fran�ais',
    url: 'https://bitcoin.fr/'
  },
  {
    title: 'Bitcoin : quel est son cours ? - JDN',
    url: 'https://www.journaldunet.fr/patrimoine/guide-des-finances-personnelles/1210185-bitcoin-definition-evolution-du-cours-comment-en-acheter/'
  },
  {
    title: "Bitcoin : qu'est-ce que c'est, comment investir et gagner de l'argent",
    url: 'https://www.phonandroid.com/bitcoin-quest-ce-que-est-comment-marche-gagner-argent.html'
  },
  {
    title: 'Bitcoin',
    url: 'https://www.francetvinfo.fr/economie/bitcoin/'
  },
  {
    title: 'Bitcoin : Actualit�, D�finition, Fonctionnement - Journal du Coin',
    url: 'https://journalducoin.com/bitcoin/'
  },
  {
    title: 'Tutoriel : comment acheter du Bitcoin de mani�re simple ?',
    url: 'https://www.journaldugeek.com/crypto/acheter/bitcoin/'
  },
  {
    title: 'Comment acheter du Bitcoin en 2022 ? Le guide A-Z pour d�buter',
    url: 'https://www.presse-citron.net/crypto/acheter/bitcoin/'
  }
]

Éviter les captchas Google via un proxy

Cet exemple fonctionnement, mais possède des limites, surtout au niveau de la volumétrie. Une fois que vous allez faire un certain nombre de requêtes, Google va vous bloquer, en demandant de remplir des captchas pour vérifier que vous bien un humain.

Pour palier à ce problème il faut passer par un proxy, voire plusieurs selon vos besoins. Le fonctionnement est relativement simple, vous allez passer par un tunnel pour ressortir sur internet avec une autre adresse IP, Google ne peut pas contrôler cette technique.

En ayant plusieurs proxy vous pouvez faire ce travail en illimité, valable également sur d'autres sites.

Proxy résidentiel vs proxy classique

J'ai évoqué précédemment la notion de proxy, mais il faut aller plus loin pour comprendre comment Google essayer de bloquer cette pratique, un proxy classique n'est ni plus ni moins qu'un tunnel sur un serveur en ligne. De ce fait Google peut comprendre que la requête sur son moteur passe par un serveur. Ce qui n'est pas systématiquement une personne qui essayer de scraper ses résultats, mais il est plus vigilant.

Il est donc possible aujourd'hui d'avoir des proxy dits résidentiels, localisés dans une ville et venant plus d'un serveur, mais de particuliers qui mettre à disposition un tunnel. Pour le coup Google va vraiment avoir du mal à bloquer ce genre de pratique, les autres sites également.