Pierwsze kroki z Web Scraping w JavaScript

Web scraping to jedna z najciekawszych rzeczy w świecie kodowania.

Co to jest skrobanie sieci?

Dlaczego w ogóle istnieje?

Poznajmy odpowiedzi.

Co to jest skrobanie sieci?

Web scraping to zautomatyzowane zadanie wydobywania danych ze stron internetowych.

Istnieje wiele zastosowań web scrapingu. Wyodrębnianie cen produktów i porównywanie ich z różnymi platformami e-Commerce. Otrzymywanie dziennej wyceny z sieci. Budowanie własnej wyszukiwarki, takiej jak Google, Yahoo itp., Lista jest długa.

Dzięki web scrapingowi możesz zrobić więcej, niż myślisz. Gdy dowiesz się, jak wyodrębnić dane ze stron internetowych, możesz zrobić z nimi, co chcesz.

Program, który pobiera dane ze stron internetowych, nazywa się web scraper. Nauczysz się pisać web scrapery w JavaScript.

Skrobanie sieci składa się głównie z dwóch części.

  • Pobieranie danych za pomocą bibliotek żądań i przeglądarki bezgłowej.
  • Analizowanie danych w celu wydobycia z nich dokładnych informacji, których potrzebujemy.

Bez zbędnych ceregieli zaczynajmy.

Konfiguracja projektu

Zakładam, że masz zainstalowany Node, jeśli nie, sprawdź przewodnik instalacji NodeJS.

Zamierzamy użyć pakietów node-fetch i cheerio do web scrapingu w JavaScript. Skonfigurujmy projekt z npm do pracy z pakietem innej firmy.

Zobaczmy szybko, jak dokończyć konfigurację.

  • Utwórz katalog o nazwie web_scraping i przejdź do niego.
  • Uruchom polecenie npm init, aby zainicjować projekt.
  • Odpowiedz na wszystkie pytania w oparciu o swoje preferencje.
  • Teraz zainstaluj pakiety za pomocą polecenia
npm install node-fetch cheerio

Zobaczmy przebłyski zainstalowanych pakietów.

pobieranie węzłów

Pakiet node-fetch przenosi plik window.fetch do środowiska node js. Pomaga w wysyłaniu żądań HTTP i uzyskiwaniu nieprzetworzonych danych.

cheerio

Paczka cheerio służy do analizowania i wydobywania niezbędnych informacji z surowych danych.

Dwa pakiety node-fetch i cheerio wystarczą do przeglądania stron internetowych w JavaScript. Nie zobaczymy każdej metody, którą zapewniają pakiety. Zobaczymy przepływ web scrapingu i najbardziej przydatne metody w tym przepływie.

Dzięki temu nauczysz się web scrapingu. No to bierzmy się do roboty.

Skrobanie listy mistrzostw świata w krykiecie

W tej sekcji zajmiemy się rzeczywistym skrobaniem sieci.

Co wydobywamy?

Myślę, że po tytule sekcji łatwo się domyślisz. Tak, cokolwiek myślisz, jest poprawne. Wyodrębnijmy dotychczasowych zwycięzców i wicemistrzów świata w krykiecie.

  • Utwórz plik o nazwie extract_cricket_world_cups_list.js w projekcie.
  • Będziemy korzystać z Wikipedii Puchar Świata w Krykiecie stronę, aby uzyskać żądane informacje.
  • Najpierw pobierz surowe dane za pomocą pakietu node-fetch.
  • Poniższy kod pobiera surowe dane z powyższej strony Wikipedii.
const fetch = require("node-fetch");

// function to get the raw data
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};

// URL for data
const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";

// start of the program
const getCricketWorldCupsList = async () => {
   const cricketWorldCupRawData = await getRawData(URL);
   console.log(cricketWorldCupRawData);
};

// invoking the main function
getCricketWorldCupsList();

Otrzymaliśmy surowe dane z adresu URL. Teraz nadszedł czas, aby wyodrębnić potrzebne informacje z surowych danych. Użyjmy pakietu cheerio, aby wyodrębnić dane.

Wyodrębnianie danych zawierających znaczniki HTML za pomocą cheerio to bułka z masłem. Zanim przejdziemy do rzeczywistych danych, zobaczmy przykładowe parsowanie danych za pomocą cheerio.

  • Przeanalizuj dane HTML za pomocą metody cheerio.load.
const parsedSampleData = cheerio.load(
      `<div id="container"><p id="title">I'm title</p></div>`
   );
  • Przeanalizowaliśmy powyższy kod HTML. Jak wyodrębnić z niego zawartość tagu p? To jest to samo, co selektory w manipulacji JavaScript DOM.

console.log(parsedSampleData(„#tytuł”).text());

Możesz wybrać tagi, jak chcesz. Możesz sprawdzić różne metody z oficjalna strona cheerio.

  • Teraz nadszedł czas, aby wyodrębnić listę mistrzostw świata. Aby wyodrębnić informacje, musimy znać znaczniki HTML, które zawierają informacje na stronie. Idź do strona Wikipedii o mistrzostwach świata w krykiecie i sprawdź stronę, aby uzyskać informacje o znacznikach HTML.

Oto pełny kod.

const fetch = require("node-fetch");
const cheerio = require("cheerio");

// function to get the raw data
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};

// URL for data
const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";

// start of the program
const getCricketWorldCupsList = async () => {
   const cricketWorldCupRawData = await getRawData(URL);

   // parsing the data
   const parsedCricketWorldCupData = cheerio.load(cricketWorldCupRawData);

   // extracting the table data
   const worldCupsDataTable = parsedCricketWorldCupData("table.wikitable")[0]
      .children[1].children;

   console.log("Year --- Winner --- Runner");
   worldCupsDataTable.forEach((row) => {
      // extracting `td` tags
      if (row.name === "tr") {
         let year = null,
            winner = null,
            runner = null;

         const columns = row.children.filter((column) => column.name === "td");

         // extracting year
         const yearColumn = columns[0];
         if (yearColumn) {
            year = yearColumn.children[0];
            if (year) {
               year = year.children[0].data;
            }
         }

         // extracting winner
         const winnerColumn = columns[3];
         if (winnerColumn) {
            winner = winnerColumn.children[1];
            if (winner) {
               winner = winner.children[0].data;
            }
         }

         // extracting runner
         const runnerColumn = columns[5];
         if (runnerColumn) {
            runner = runnerColumn.children[1];
            if (runner) {
               runner = runner.children[0].data;
            }
         }

         if (year && winner && runner) {
            console.log(`${year} --- ${winner} --- ${runner}`);
         }
      }
   });
};

// invoking the main function
getCricketWorldCupsList();

A oto zeskrobane dane.

Year --- Winner --- Runner
1975 --- West Indies --- Australia
1979 --- West Indies --- England
1983 --- India --- West Indies
1987 --- Australia --- England
1992 --- Pakistan --- England
1996 --- Sri Lanka --- Australia
1999 --- Australia --- Pakistan
2003 --- Australia --- India
2007 --- Australia --- Sri Lanka
2011 --- India --- Sri Lanka
2015 --- Australia --- New Zealand
2019 --- England --- New Zealand

Fajne 😎, prawda?

Skrobanie szablonu

Pobieranie nieprzetworzonych danych z adresu URL jest powszechne w każdym projekcie skrobania stron internetowych. Jedyną częścią, która się zmienia, jest wyodrębnianie danych zgodnie z wymaganiami. Możesz wypróbować poniższy kod jako szablon.

const fetch = require("node-fetch");
const cheerio = require("cheerio");
const fs = require("fs");
// function to get the raw data
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};
// URL for data
const URL = "https://example.com/";
// start of the program
const scrapeData = async () => {
   const rawData = await getRawData(URL);
   // parsing the data
   const parsedData = cheerio.load(rawData);
   console.log(parsedData);
   // write code to extract the data
   // here
   // ...
   // ...
};
// invoking the main function
scrapeData();

Wniosek

Nauczyłeś się, jak zeskrobać stronę internetową. Teraz Twoja kolej na ćwiczenie kodowania.

Sugerowałbym również sprawdzenie popularnych platform do skrobania stron internetowych w celu zbadania i opartych na chmurze rozwiązań do skrobania stron internetowych.

Miłego kodowania 🙂

Podobał Ci się artykuł? A co powiesz na dzielenie się ze światem?