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.
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.
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?
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?