Darba sākšana ar Web Scraping JavaScript

Tīmekļa skrāpēšana ir viena no interesantākajām lietām kodēšanas pasaulē.

Kas ir tīmekļa nokasīšana?

Kāpēc tas vispār pastāv?

Noskaidrosim atbildes.

Kas ir tīmekļa skrāpēšana?

Tīmekļa skrāpēšana ir automatizēts uzdevums datu iegūšanai no vietnēm.

Ir daudz tīmekļa nokasīšanas lietojumprogrammu. Produktu cenu iegūšana un to salīdzināšana ar dažādām e-komercijas platformām. Ikdienas citāta iegūšana no tīmekļa. Izveidojot savu meklētājprogrammu, piemēram, Google, Yahoo u.c., sarakstu var turpināt.

Izmantojot tīmekļa nokasīšanu, varat paveikt vairāk, nekā domājat. Kad esat uzzinājis, kā iegūt datus no vietnēm, varat ar datiem darīt visu, ko vēlaties.

Programmu, kas iegūst datus no vietnēm, sauc par tīmekļa skrāpi. Jūs iemācīsities rakstīt tīmekļa skrāpjus JavaScript.

Tīmekļa skrāpēšanai galvenokārt ir divas daļas.

  • Datu iegūšana, izmantojot pieprasījumu bibliotēkas un pārlūkprogrammu bez galvas.
  • Datu parsēšana, lai no datiem iegūtu precīzu informāciju, ko mēs vēlamies.

Bez turpmākas runas sāksim.

Projekta iestatīšana

Es pieņemu, ka esat instalējis Node, ja ne, skatiet NodeJS instalēšanas rokasgrāmatu.

Mēs izmantosim pakotnes node-fetch un cheerio tīmekļa skrāpēšanai JavaScript. Iestatīsim projektu, izmantojot npm, lai tas darbotos ar trešās puses pakotni.

Apskatīsim darbības, kas jāveic, lai pabeigtu iestatīšanu.

  • Izveidojiet direktoriju ar nosaukumu web_scraping un dodieties uz to.
  • Palaidiet komandu npm init, lai inicializētu projektu.
  • Atbildiet uz visiem jautājumiem, pamatojoties uz jūsu vēlmēm.
  • Tagad instalējiet pakotnes, izmantojot komandu
npm install node-fetch cheerio

Apskatīsim instalēto pakotņu ieskatus.

  9 Venna diagrammu veidotāji datu salīdzināšanai un vizuālai kārtošanai

node-fetch

Pakotne node-fetch nodrošina logu.fetch node js vidē. Tas palīdz veikt HTTP pieprasījumus un iegūt neapstrādātus datus.

cheerio

Sūtījums cheerio tiek izmantots, lai parsētu un iegūtu informāciju, kas ir nepieciešama no neapstrādātajiem datiem.

Divas pakotnes node-fetch un cheerio ir pietiekami labas tīmekļa skrāpēšanai JavaScript. Mēs neredzēsim visas pakotņu piedāvātās metodes. Mēs redzēsim tīmekļa skrāpēšanas plūsmu un visnoderīgākās metodes šajā plūsmā.

To darot, jūs apgūsit tīmekļa skrāpēšanu. Tātad, ķersimies pie darba.

Kasīšanas kriketa Pasaules kausa saraksts

Šajā sadaļā mēs veiksim faktisku tīmekļa nokasīšanu.

Ko mēs iegūstam?

Pēc sadaļas nosaukuma es domāju, ka jūs to viegli uzminēt. Jā, viss, ko jūs domājat, ir pareizi. Izvilksim visus pasaules kausa ieguvējus un vicečempionus līdz šim.

  • Projektā izveidojiet failu ar nosaukumu extract_cricket_world_cups_list.js.
  • Mēs izmantosim Wikipedia Pasaules kauss kriketā lapu, lai iegūtu vajadzīgo informāciju.
  • Vispirms iegūstiet neapstrādātos datus, izmantojot mezgla ieneses pakotni.
  • Zemāk redzamais kods iegūst neapstrādātus datus no iepriekš minētās Vikipēdijas lapas.
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();

Mēs ieguvām neapstrādātus datus no URL. Tagad ir pienācis laiks iegūt nepieciešamo informāciju no neapstrādātajiem datiem. Datu iegūšanai izmantosim pakotni cheerio.

Datu iegūšana, kas ietver HTML tagus ar cheerio, ir vienkārša. Pirms iedziļināties faktiskajos datos, apskatīsim dažus datu parsēšanas piemērus, izmantojot cheerio.

  • Parsējiet HTML datus, izmantojot metodi cheerio.load.
const parsedSampleData = cheerio.load(
      `<div id="container"><p id="title">I'm title</p></div>`
   );
  • Mēs esam parsējuši iepriekš minēto HTML kodu. Kā no tā izvilkt p taga saturu? Tas ir tāds pats kā JavaScript DOM manipulāciju atlasītāji.
  7 Amazon cenu izsekotāji, ko iegādāties īstajā laikā

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

Varat atlasīt atzīmes, kā vēlaties. Varat pārbaudīt dažādas metodes no cheerio oficiālā vietne.

  • Tagad ir pienācis laiks iegūt Pasaules kausa sarakstu. Lai iegūtu informāciju, mums ir jāzina HTML tagi, ka informācija atrodas lapā. Dodieties uz kriketa pasaules kausa Vikipēdijas lapa un pārbaudiet lapu, lai iegūtu informāciju par HTML tagiem.

Šeit ir pilns kods.

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

Un šeit ir nokasīti dati.

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

Forši 😎, vai ne?

  Kā mainīt noklusējuma PlayStation maksājuma veidu

Kasīšanas veidne

Neapstrādātu datu iegūšana no URL ir izplatīta katrā tīmekļa kopēšanas projektā. Vienīgā daļa, kas mainās, ir datu iegūšana atbilstoši prasībām. Varat izmēģināt tālāk norādīto kodu kā veidni.

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

Secinājums

Jūs esat iemācījušies nokasīt tīmekļa lapu. Tagad ir jūsu kārta praktizēt kodēšanu.

Es arī ieteiktu pārbaudīt populārās tīmekļa kopēšanas ietvarus, lai izpētītu un uz mākoņiem balstītus tīmekļa kopēšanas risinājumus.

Laimīgu kodēšanu 🙂

Vai jums patika lasīt rakstu? Kā būtu ar dalīšanos ar pasauli?