Node.js, Tor, Puppeteer et Cheerio: grattage web anonyme

Le scraping Web est une méthode de collecte de données à partir de sites Web. Ce terme est couramment utilisé en relation avec la collecte automatisée de données. Aujourd'hui, nous allons parler de la façon de collecter des données de sites de maniÚre anonyme. La raison pour laquelle quelqu'un peut souhaiter l'anonymat dans le scraping Web est que de nombreux serveurs Web appliquent certaines rÚgles aux connexions à partir d'adresses IP, à partir desquelles un certain nombre de demandes sont effectuées sur une certaine période de temps. Ici, nous utiliserons les outils suivants:

  • Marionnettiste - pour accĂ©der aux pages Web.
  • Cheerio - pour analyser le code HTML.
  • Tor - pour exĂ©cuter chaque demande Ă  partir d'une adresse IP diffĂ©rente.

Il convient de noter que les aspects juridiques du grattage Web sont une question complexe et souvent peu claire. Par conséquent, respectez les " Conditions d'utilisation " des pages dont vous collectez les données. Voici du bon matériel sur ce sujet.



Installation de Tor


Commençons par le début - donc, tout d'abord, installez le client Tor en utilisant la commande suivante:

sudo apt-get install tor

Configuration de Tor


Configurez maintenant le client Tor. La configuration par dĂ©faut de Tor utilise le port SOCKS , qui nous donne un chemin vers un nƓud de sortie unique (c'est-Ă -dire une adresse IP). Pour une utilisation quotidienne de Tor, comme la simple navigation sur le Web, c'est un bon choix. Mais nous avons besoin de quelques adresses IP. Cela vous permettra de basculer entre eux pendant le processus de grattage Web.

Afin de configurer Tor selon nos besoins, nous ouvrons simplement des ports supplémentaires pour écouter les connexions SOCKS. Cela se fait en ajoutant plusieurs entrées SocksPortau fichier de configuration principal du programme, qui se trouve à l'adresse /etc/tor.

Ouvrez le fichier à l' /etc/tor/torrcaide d'un éditeur de texte et ajoutez les entrées suivantes à la fin du fichier:

#  4 SOCKS-,       Tor-.

SocksPort 9050
SocksPort 9052
SocksPort 9053
SocksPort 9054

Ici, il convient de prĂȘter attention aux Ă©lĂ©ments suivants:

  • SocksPort . — , , SOCKS, .
  • SocksPort , , , - .
  • 9050 — , Tor- .
  • 9051. Tor , , , Tor.
  • 9051, , 1.

Afin d'appliquer les modifications apportées au fichier de configuration, redémarrez le client Tor:

sudo /etc/init.d/tor restart

Création d'un nouveau projet Node.js


Créez un nouveau répertoire pour le projet. Appelons-la superWebScraping:

mkdir superWebScraping

Allons dans ce répertoire et initialisons un projet Node vide:

cd superWebScraping && npm init -y

Définissez les dépendances nécessaires:

npm i --save puppeteer cheerio

Travailler avec des sites Web Ă  l'aide de Puppeteer


Puppeteer est un navigateur sans interface utilisateur qui utilise le protocole DevTools pour interagir avec Chrome ou Chromium . La raison pour laquelle nous n'utilisons pas de bibliothĂšque ici pour travailler avec des requĂȘtes, comme tor-request , est qu'une telle bibliothĂšque ne pourra pas traiter les sites crĂ©Ă©s comme des applications Web Ă  page unique dont le contenu est chargĂ© dynamiquement.

Créez un fichier index.jset insérez-y le code suivant. Les principales caractéristiques de ce code sont décrites dans les commentaires.

/**
 *   puppeteer.
 */
const puppeteer = require('puppeteer');

/**
 *   main  , 
 *     -.
 * ,      ,
 *   ,     
 *  puppeteer.
 */
async function main() {
  /**
   *  Chromium.   `headless`   false,
   *     .
   */
  const browser = await puppeteer.launch({
    headless: false
  });

  /**
   *   .
   */
  const page = await browser.newPage();

  /**
   *   ,   https://api.ipify.org.
   */
  await page.goto('https://api.ipify.org');

  /**
   *  3     .
   */
  setTimeout(() => {
    browser.close();
  }, 3000);
}

/**
 *  ,  main().
 */
main();

Exécutez le script avec la commande suivante:

node index.js

AprĂšs cela, la fenĂȘtre du navigateur Chromium devrait apparaĂźtre sur l'Ă©cran, dans lequel l'adresse est ouverte https://api.ipify.org.


FenĂȘtre du navigateur, la connexion Tor n'est pas utilisĂ©e.

Je l'ai ouverte dans la fenĂȘtre du navigateur prĂ©cisĂ©menthttps://api.ipify.orgparce que cette page peut afficher l'adresse IP publique Ă  partir de laquelle elle est accessible. Il s'agit de l'adresse visible par les sites que je visite si je les visite sans utiliser Tor.

Modifiez le code ci-dessus en ajoutant la clé suivante à l'objet avec les paramÚtres transmispuppeteer.launch:

  /**
   *  Chromium.   `headless`  false,
   *     .
   */
  const browser = await puppeteer.launch({
  headless: false,
  
  //   .
  args: ['--proxy-server=socks5://127.0.0.1:9050']
});

Nous avons transmis un argument au navigateur --proxy-server. La valeur de cet argument indique au navigateur qu'il doit utiliser un serveur proxy socks5 exécuté sur notre ordinateur et accessible sur le port 9050. Le numéro de port est l'un de ces numéros que nous avons précédemment entré dans le fichier torrc.

Exécutez à nouveau le script:

node index.js

Cette fois, sur la page ouverte, vous pouvez voir une adresse IP différente. Il s'agit de l'adresse utilisée pour visualiser le site via le réseau Tor.


FenĂȘtre du navigateur, la connexion Tor est utilisĂ©e.

Dans mon cas, une adresse est apparue dans cette fenĂȘtre144.217.7.33. Vous pouvez avoir une autre adresse. Veuillez noter que si vous rĂ©exĂ©cutez le script et utilisez le mĂȘme numĂ©ro de port (9050), vous recevrez la mĂȘme adresse IP que vous avez reçue auparavant.


FenĂȘtre de navigateur relancĂ©e, la connexion Tor est utilisĂ©e,

c'est pourquoi dans les paramĂštres Tor, nous avons ouvert plusieurs ports. Essayez de connecter votre navigateur Ă  un autre port. Cela changera l'adresse IP.

Collecte de données avec Cheerio


Maintenant que nous avons un mĂ©canisme pratique pour charger les pages, il est temps de faire du scraping web. Pour cela, nous allons utiliser la bibliothĂšque cheerio . Il s'agit d'un analyseur HTML dont l'API est construite de la mĂȘme maniĂšre que l'API jQuery . Notre objectif est d'obtenir 5 des derniers articles de la page Hacker News.

Accédez au site Web Hacker News .


Site Web de Hacker News

Nous voulons prendre 5 nouveaux titres de la page ouverte (maintenant c'est HAKMEM (1972), Larry Roberts est décédé et d'autres). En examinant le titre de l'article à l'aide des outils de développement du navigateur, j'ai remarqué que chaque titre est placé dans un élément HTML<a>avec une classestorylink.


Examen de la structure du document

Afin d'extraire du code HTML de la page ce dont nous avons besoin, nous devons effectuer la séquence d'actions suivante:

  • DĂ©marrage d'une nouvelle instance de navigateur sans interface utilisateur connectĂ©e au proxy Tor.
  • CrĂ©ez une nouvelle page.
  • Allez Ă  l'adresse https://news.ycombinator.com/.
  • RĂ©cupĂ©ration du contenu HTML de la page.
  • Chargement du contenu HTML de la page dans cheerio.
  • CrĂ©ation d'un tableau pour enregistrer les titres des articles.
  • AccĂšs aux Ă©lĂ©ments avec une classe storylink.
  • Obtention des 5 premiers Ă©lĂ©ments Ă  l'aide de la mĂ©thode cheerio slice () .
  • Parcourant les Ă©lĂ©ments rĂ©sultants Ă  l'aide de la mĂ©thode cheerio each () .
  • Écrivez chaque en-tĂȘte trouvĂ© dans un tableau.

Voici le code qui implémente ces actions:

const puppeteer = require('puppeteer');

/**
 *   cheerio.
 */
const cheerio = require('cheerio');

async function main() {
  const browser = await puppeteer.launch({
    /**
     *       (   ).
     */
    headless: true,
    args: ['--proxy-server=socks5://127.0.0.1:9050']
  });

  const page = await browser.newPage();

  await page.goto('https://news.ycombinator.com/');

  /**
   *      HTML-.
   */
  const content = await page.content();

  /**
   *    cheerio.
   */
  const $ = cheerio.load(content);


  /**
   *      .
   */
  const titles = [];

  /**
   *   ,   `storylink`.
   *  slice()      5   .
   *      each().
   */
  $('.storylink').slice(0, 5).each((idx, elem) => {
    /**
     *   HTML-,   .
     */
    const title = $(elem).text();
  
    /**
     *    .
     */
    titles.push(title);
  })

  browser.close();
  
  /**
   *     .
   */
  console.log(titles);
}

main();

Voici ce qui se passe aprÚs l'exécution de ce script.


Les 5 premiers titres de Hacker News extraits avec succĂšs du code de page

Raclage continu en utilisant différentes adresses IP


Voyons maintenant comment utiliser les différents ports SOCKS que nous avons spécifiés dans le fichier torrc. C'est assez simple. Nous déclarerons un tableau, dont chacun contiendra un numéro de port. Renommez ensuite la fonction main()en fonction scrape()et déclarez une nouvelle fonction main()qui appellera la fonction scrape(), en lui passant un nouveau numéro de port à chaque appel.

Voici le code fini:

const puppeteer = require('puppeteer');
const cheerio = require('cheerio');

async function scrape(port) {
  const browser = await puppeteer.launch({
    args: ['--proxy-server=socks5://127.0.0.1:' + port]
  });

  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com/');
  const content = await page.content();

  const $ = cheerio.load(content);

  const titles = [];

  $('.storylink').slice(0, 5).each((idx, elem) => {
    const title = $(elem).text();
    titles.push(title);
  });

  browser.close();
  return titles;
}

async function main() {
  /**
   *  SOCKS- Tor,    torrc. 
   */
  const ports = [
    '9050',
    '9052',
    '9053',
    '9054'
  ];
  
  /**
   *  -...
   */
  while (true) {
    for (const port of ports) {
      /**
       * ...  -    .
       */
      console.log(await scrape(port));
    }
  }
}

main();

Sommaire


Maintenant, vous avez des outils Ă  votre disposition qui vous permettent de faire du grattage Web anonyme.

Chers lecteurs! Avez-vous déjà fait du grattage Web? Si oui, veuillez nous indiquer les outils que vous utilisez pour cela.

Source: https://habr.com/ru/post/undefined/


All Articles