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.
- Teraz możemy przejść do wyodrębniania listy mistrzostw świata. Aby to zrobić, musimy znać strukturę HTML, w której znajdują się potrzebne informacje. Przejdź na stronę Wikipedii z mistrzostwami świata w krykiecie i zbadaj kod strony.
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
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.