Pierwsze kroki z Web Scraping w JavaScript

Photo of author

By maciekx

Web scraping to fascynująca dziedzina programowania.

Ale czym właściwie jest scraping stron www?

I dlaczego w ogóle istnieje taka technologia?

Odkryjmy odpowiedzi na te pytania.

Czym jest web scraping?

Web scraping to zautomatyzowany proces pobierania danych ze stron internetowych.

Zastosowań tego procesu jest mnóstwo. Możemy wyodrębniać ceny produktów, a następnie porównywać je pomiędzy różnymi platformami e-commerce. Możemy także pozyskiwać bieżące notowania giełdowe czy tworzyć własną wyszukiwarkę internetową na wzór Google lub Yahoo. Lista możliwości jest naprawdę długa.

Dzięki web scrapingowi twoje możliwości są większe, niż przypuszczasz. Kiedy już opanujesz technikę pozyskiwania danych ze stron internetowych, będziesz mógł robić z nimi, co tylko zechcesz.

Program, który odpowiada za automatyczne pobieranie danych z witryn internetowych, nazywamy web scraperem. W dalszej części artykułu dowiesz się, jak tworzyć takie programy w języku JavaScript.

Skrobanie stron internetowych zasadniczo obejmuje dwa główne etapy:

  • Pobieranie danych za pomocą bibliotek realizujących żądania HTTP oraz tzw. przeglądarek bezgłowych.
  • Analizowanie pobranych danych w celu wyodrębnienia z nich dokładnie tych informacji, które nas interesują.

Przejdźmy zatem od razu do konkretów.

Konfiguracja środowiska

Zakładamy, że masz już zainstalowane środowisko Node.js. Jeśli nie, odsyłam do poradnika instalacji.

Do web scrapingu za pomocą JavaScript użyjemy bibliotek node-fetch oraz cheerio. Skonfigurujmy zatem projekt za pomocą menedżera pakietów npm, aby móc pracować z zewnętrznymi bibliotekami.

Zobaczmy, jak szybko to zrobić:

  • Utwórz katalog o nazwie „web_scraping” i przejdź do niego w terminalu.
  • Wpisz polecenie „npm init”, aby zainicjować nowy projekt.
  • Odpowiedz na pytania w kreatorze, dostosowując ustawienia do swoich preferencji.
  • Teraz zainstaluj potrzebne biblioteki, używając polecenia:
npm install node-fetch cheerio

Przyjrzyjmy się krótko zainstalowanym bibliotekom.

node-fetch

Biblioteka node-fetch przenosi funkcję „window.fetch” do środowiska Node.js. Ułatwia to wysyłanie żądań HTTP i pobieranie nieprzetworzonych danych z serwera.

cheerio

Pakiet cheerio służy do analizowania pobranych danych HTML i wyodrębniania z nich potrzebnych nam informacji.

Te dwa pakiety, node-fetch i cheerio, są wystarczające do skrobania stron internetowych w JavaScript. Nie będziemy analizować wszystkich dostępnych w nich metod, skupimy się na przepływie web scrapingu i najczęściej stosowanych funkcjach.

W ten sposób zdobędziesz podstawową wiedzę na temat web scrapingu. Przejdźmy zatem do konkretnego zadania.

Skrobanie listy mistrzostw świata w krykiecie

W tej sekcji zajmiemy się praktycznym przykładem skrobania danych ze strony internetowej.

Co dokładnie będziemy pobierać?

Myślę, że po tytule sekcji łatwo się domyślić. Tak, zgadza się. Będziemy pobierać listę zwycięzców i wicemistrzów świata w krykiecie z poszczególnych lat.

  • Utwórz w swoim projekcie plik o nazwie „extract_cricket_world_cups_list.js”.
  • Będziemy korzystać ze strony Wikipedii poświęconej Mistrzostwom Świata w Krykiecie, aby pozyskać interesujące nas informacje.
  • Najpierw musimy pobrać surowe dane HTML za pomocą biblioteki node-fetch.
  • Poniższy kod pobierze dane ze wspomnianej strony Wikipedii.
const fetch = require("node-fetch");

// funkcja do pobierania nieprzetworzonych danych
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};

// adres URL strony, z której będziemy pobierać dane
const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";

// główna funkcja programu
const getCricketWorldCupsList = async () => {
   const cricketWorldCupRawData = await getRawData(URL);
   console.log(cricketWorldCupRawData);
};

// wywołanie głównej funkcji
getCricketWorldCupsList();

W ten sposób otrzymaliśmy surowe dane HTML z podanego adresu URL. Teraz musimy wyodrębnić z tych danych potrzebne nam informacje, wykorzystując do tego bibliotekę cheerio.

Wyodrębnianie danych z kodu HTML za pomocą cheerio jest bardzo proste. Zanim przejdziemy do konkretnych danych, zobaczmy na prostym przykładzie, jak analizować dane za pomocą cheerio.

  • Za pomocą metody „cheerio.load” przeanalizujemy przykładowy kod HTML:
const parsedSampleData = cheerio.load(
      `<div id="container"><p id="title">To jest tytuł</p></div>`
   );
  • Powyższy kod HTML został przeanalizowany. Jak wyodrębnić z niego zawartość znacznika „<p>”? Używamy selektorów, podobnie jak w manipulacji drzewem DOM w JavaScripcie.

console.log(parsedSampleData(„#title”).text());

Możesz wybierać elementy HTML za pomocą różnych selektorów. Więcej informacji znajdziesz w oficjalnej dokumentacji cheerio.

Oto pełny kod, który realizuje opisane zadanie:

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

// funkcja do pobierania surowych danych
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};

// adres URL strony
const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";

// główna funkcja programu
const getCricketWorldCupsList = async () => {
   const cricketWorldCupRawData = await getRawData(URL);

   // analiza danych HTML
   const parsedCricketWorldCupData = cheerio.load(cricketWorldCupRawData);

   // wyodrębnienie tabeli z danymi o mistrzostwach
   const worldCupsDataTable = parsedCricketWorldCupData("table.wikitable")[0]
      .children[1].children;

   console.log("Rok --- Zwycięzca --- Wicemistrz");
   worldCupsDataTable.forEach((row) => {
      // wyodrębnienie znaczników `td` (komórek tabeli)
      if (row.name === "tr") {
         let year = null,
            winner = null,
            runner = null;

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

         // wyodrębnienie roku
         const yearColumn = columns[0];
         if (yearColumn) {
            year = yearColumn.children[0];
            if (year) {
               year = year.children[0].data;
            }
         }

         // wyodrębnienie zwycięzcy
         const winnerColumn = columns[3];
         if (winnerColumn) {
            winner = winnerColumn.children[1];
            if (winner) {
               winner = winner.children[0].data;
            }
         }

         // wyodrębnienie wicemistrza
         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}`);
         }
      }
   });
};

// wywołanie głównej funkcji
getCricketWorldCupsList();

A oto wyniki naszego skrobania:

Rok --- Zwycięzca --- Wicemistrz
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

Super, prawda? 😎

Szablon do skrobania stron

Pobieranie surowych danych z adresu URL jest standardową operacją w każdym projekcie web scrapingowym. Zmienia się jedynie sposób wyodrębniania danych, w zależności od naszych potrzeb. Poniższy kod możesz wykorzystać jako szablon do skrobania stron:

const fetch = require("node-fetch");
const cheerio = require("cheerio");
const fs = require("fs");
// funkcja do pobierania surowych danych
const getRawData = (URL) => {
   return fetch(URL)
      .then((response) => response.text())
      .then((data) => {
         return data;
      });
};
// adres URL strony
const URL = "https://example.com/";
// główna funkcja programu
const scrapeData = async () => {
   const rawData = await getRawData(URL);
   // analiza danych HTML
   const parsedData = cheerio.load(rawData);
   console.log(parsedData);
   // tu wstaw kod do wyodrębniania danych
   // ...
   // ...
};
// wywołanie głównej funkcji
scrapeData();

Podsumowanie

W tym artykule nauczyłeś się, jak skrobać strony internetowe. Teraz czas na praktyczne ćwiczenia.

Zachęcam również do zapoznania się z popularnymi platformami do skrobania stron internetowych oraz z rozwiązaniami chmurowymi w tym obszarze.

Miłego kodowania! 🙂

Podobał Ci się ten artykuł? Podziel się nim ze światem!


newsblog.pl