Node.js, Tor, Puppenspieler und Cheerio: anonymes Web-Scraping

Web Scraping ist eine Methode zum Sammeln von Daten von Websites. Dieser Begriff wird häufig in Bezug auf die automatisierte Datenerfassung verwendet. Heute werden wir darüber sprechen, wie Sie anonym Daten von Websites sammeln können. Der Grund, warum jemand Anonymität beim Web-Scraping wünscht, liegt darin, dass viele Webserver bestimmte Regeln auf Verbindungen von IP-Adressen anwenden, von denen über einen bestimmten Zeitraum eine bestimmte Anzahl von Anforderungen gestellt wird. Hier werden wir die folgenden Werkzeuge verwenden:

  • Puppenspieler - für den Zugriff auf Webseiten.
  • Cheerio - zum Parsen von HTML-Code.
  • Tor - um jede Anfrage von einer anderen IP-Adresse auszuführen.

Es ist zu beachten, dass die rechtlichen Aspekte des Web Scraping ein komplexes und oft unklares Thema sind. Beachten Sie daher die " Nutzungsbedingungen " der Seiten, deren Daten Sie sammeln. Hier ist gutes Material zu diesem Thema.



Tor Installation


Beginnen wir von vorne - installieren Sie daher zunächst den Tor-Client mit dem folgenden Befehl:

sudo apt-get install tor

Tor einrichten


Konfigurieren Sie nun den Tor-Client. Die Standardkonfiguration von Tor verwendet den SOCKS- Port , der uns einen Pfad zu einem einzelnen Ausgabeknoten gibt (dh eine IP-Adresse). Für den täglichen Gebrauch von Tor, wie das Surfen im Internet, ist dies eine gute Lösung. Wir brauchen aber einige IP-Adressen. Auf diese Weise können Sie während des Web-Scraping-Vorgangs zwischen ihnen wechseln.

Um Tor nach Bedarf zu konfigurieren, öffnen wir einfach zusätzliche Ports zum Abhören von SOCKS-Verbindungen. Dazu fügen Sie SocksPortder Hauptkonfigurationsdatei des Programms mehrere Einträge hinzu , die Sie unter finden /etc/tor.

Öffnen Sie die Datei /etc/tor/torrcmit einem Texteditor und fügen Sie am Ende der Datei die folgenden Einträge hinzu:

#  4 SOCKS-,       Tor-.

SocksPort 9050
SocksPort 9052
SocksPort 9053
SocksPort 9054

Hier ist Folgendes zu beachten:

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

Starten Sie den Tor-Client neu, um die an der Konfigurationsdatei vorgenommenen Änderungen zu übernehmen:

sudo /etc/init.d/tor restart

Erstellen eines neuen Node.js-Projekts


Erstellen Sie ein neues Verzeichnis für das Projekt. Nennen wir sie superWebScraping:

mkdir superWebScraping

Gehen wir in dieses Verzeichnis und initialisieren ein leeres Knotenprojekt:

cd superWebScraping && npm init -y

Stellen Sie die erforderlichen Abhängigkeiten ein:

npm i --save puppeteer cheerio

Arbeiten Sie mit Puppeteer mit Websites


Puppeteer ist ein Browser ohne Benutzeroberfläche , der das DevTools- Protokoll verwendet, um mit Chrome oder Chromium zu interagieren . Der Grund, warum wir die Bibliothek hier nicht verwenden, um mit Anforderungen wie tor-request zu arbeiten , liegt darin, dass eine solche Bibliothek keine Websites verarbeiten kann, die als einseitige Webanwendungen erstellt wurden, deren Inhalt dynamisch geladen wird.

Erstellen Sie eine Datei index.jsund fügen Sie den folgenden Code ein. Die Hauptmerkmale dieses Codes sind in den Kommentaren beschrieben.

/**
 *   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();

Führen Sie das Skript mit dem folgenden Befehl aus:

node index.js

Danach sollte das Chromium-Browserfenster auf dem Bildschirm angezeigt werden, auf dem die Adresse geöffnet ist https://api.ipify.org.




Browserfenster , Tor-Verbindung wird nicht verwendet. Ich habe es im Browserfenster geöffnet, geradehttps://api.ipify.orgweil diese Seite die öffentliche IP-Adresse anzeigen kann, von der aus auf sie zugegriffen wird. Dies ist die Adresse, die für die von mir besuchten Websites sichtbar ist, wenn ich sie ohne Verwendung von Tor besuche.

Ändern Sie den obigen Code, indem Sie dem Objekt den folgenden Schlüssel mit den übergebenen Parametern hinzufügenpuppeteer.launch:

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

Wir haben ein Argument an den Browser übergeben --proxy-server. Der Wert dieses Arguments teilt dem Browser mit, dass er einen socks5-Proxyserver verwenden soll, der auf unserem Computer ausgeführt wird und über den Port zugänglich ist 9050. Die Portnummer ist eine der Nummern, die wir zuvor in die Datei eingegeben haben torrc.

Führen Sie das Skript erneut aus:

node index.js

Dieses Mal sehen Sie auf der geöffneten Seite eine andere IP-Adresse. Dies ist die Adresse, die zum Anzeigen der Site über das Tor-Netzwerk verwendet wird.


Browserfenster, Tor-Verbindung wird verwendet.

In meinem Fall wurde in diesem Fenster eine Adresse angezeigt144.217.7.33. Möglicherweise haben Sie eine andere Adresse. Bitte beachten Sie, dass Sie, wenn Sie das Skript erneut ausführen und dieselbe Portnummer (9050) verwenden, dieselbe IP-Adresse erhalten, die Sie zuvor erhalten haben.


Das Browserfenster wurde neu gestartet. Die Tor-Verbindung wird verwendet.

Deshalb haben wir in den Tor-Einstellungen mehrere Ports geöffnet. Versuchen Sie, Ihren Browser an einen anderen Port anzuschließen. Dadurch wird die IP-Adresse geändert.

Datenerfassung mit Cheerio


Jetzt, da wir einen praktischen Mechanismus zum Laden von Seiten haben, ist es Zeit, Web-Scraping durchzuführen. Dafür werden wir die Cheerio- Bibliothek nutzen . Dies ist ein HTML-Parser, dessen API auf dieselbe Weise wie die jQuery- API erstellt wird . Unser Ziel ist es, 5 der neuesten Beiträge von der Hacker News-Seite zu erhalten.

Gehen Sie zur Hacker News- Website .


Hacker News-Website

Wir möchten 5 neue Schlagzeilen von der offenen Seite nehmen (jetzt ist es HAKMEM (1972), Larry Roberts ist gestorben und andere). Als ich den Titel des Artikels mit den Browser-Entwicklertools untersuchte, stellte ich fest, dass jeder Titel in einem HTML-Element<a>mit einer Klasse platziert iststorylink.


Untersuchung der Struktur des Dokuments

Um das zu extrahieren, was wir aus dem HTML-Code der Seite benötigen, müssen wir die folgende Abfolge von Aktionen ausführen:

  • Starten einer neuen Browserinstanz ohne eine mit dem Tor-Proxy verbundene Benutzeroberfläche.
  • Erstellen Sie eine neue Seite.
  • Gehen Sie zur Adresse https://news.ycombinator.com/.
  • Abrufen des HTML-Inhalts der Seite.
  • Laden des HTML-Inhalts der Seite in cheerio.
  • Erstellen eines Arrays zum Speichern von Artikeltiteln.
  • Zugriff auf Elemente mit einer Klasse storylink.
  • Abrufen der ersten 5 Elemente mithilfe der cheerio Slice () -Methode .
  • Durchlaufen der resultierenden Elemente mit der cheerio each () -Methode .
  • Schreiben Sie jeden gefundenen Header in ein Array.

Hier ist der Code, der diese Aktionen implementiert:

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();

Folgendes passiert nach dem Ausführen dieses Skripts.


Die ersten 5 Hacker-News-Schlagzeilen wurden erfolgreich aus dem Seitencode extrahiert

Kontinuierliches Scraping mit unterschiedlichen IP-Adressen


Lassen Sie uns nun darüber sprechen, wie die verschiedenen SOCKS-Ports verwendet werden, die wir in der Datei angegeben haben torrc. Es ist ziemlich einfach. Wir werden ein Array deklarieren, von dem jedes eine Portnummer enthält. Benennen Sie dann die Funktion main()in eine Funktion um scrape()und deklarieren Sie eine neue Funktion main(), die die Funktion scrape()aufruft, und übergeben Sie ihr bei jedem Aufruf eine neue Portnummer.

Hier ist der fertige Code:

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();

Zusammenfassung


Jetzt stehen Ihnen Tools zur Verfügung, mit denen Sie anonymes Web-Scraping durchführen können.

Liebe Leser! Haben Sie schon einmal Web Scraping gemacht? Wenn ja, teilen Sie uns bitte mit, welche Tools Sie dafür verwenden.

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


All Articles