Крайното ръководство за уеб изстъргване с Node.js

И така, какво все пак изстъргва мрежата? Включва автоматизиране на трудоемката задача за събиране на информация от уебсайтове.

Има много случаи на използване за изстъргване в мрежата: може да искате да събирате цени от различни сайтове за електронна търговия за сайт за сравнение на цените. Или може би имате нужда от полетни часове и списъци с хотели / AirBNB за туристически сайт. Може би искате да събирате имейли от различни директории за възможни продажби или да използвате данни от интернет за обучение на модели за машинно обучение / AI. Или дори може да искате да създадете търсачка като Google!

Първите стъпки с изстъргването в мрежата са лесни и процесът може да бъде разделен на две основни части:

  • придобиване на данни с помощта на библиотека с HTML заявки или безглав браузър,
  • и анализиране на данните, за да получите точната информация, която искате.

Това ръководство ще ви преведе през процеса с популярния модул за обещаване на заявки Node.js, CheerioJS и Puppeteer. Работейки през примерите в това ръководство, ще научите всички съвети и трикове, от които се нуждаете, за да станете професионалист при събирането на всякакви данни, от които се нуждаете, с Node.js!

Ще събираме списък с всички имена и рождени дни на американските президенти от Уикипедия и заглавията на всички публикации на първата страница на Reddit.

Първи неща първо: Нека инсталираме библиотеките, които ще използваме в това ръководство (Puppeteer ще отнеме известно време, докато се инсталира, тъй като трябва да изтегли и Chromium).

Направете първата си заявка

След това нека отворим нов текстов файл (назовем файла potusScraper.js) и напишем бърза функция, за да получим HTML на страницата „Списък на президентите“ в Уикипедия.

Изход:

Използване на Chrome DevTools

Готино, взехме суровия HTML от уеб страницата! Но сега трябва да осмислим тази гигантска петна от текст. За целта ще трябва да използваме Chrome DevTools, за да ни позволи лесно да търсим в HTML на уеб страница.

Използването на Chrome DevTools е лесно: просто отворете Google Chrome и щракнете с десния бутон върху елемента, който искате да изтриете (в този случай щраквам с десния бутон върху Джордж Вашингтон, защото искаме да получим връзки към всички страници на Уикипедия на отделните президенти) :

Сега просто щракнете върху проверка и Chrome ще изведе своя панел DevTools, което ви позволява лесно да проверите изходния HTML на страницата.

Разбор на HTML с Cheerio.js

Страхотно, Chrome DevTools сега ни показва точния модел, който трябва да търсим в кода („голям“ таг с хипервръзка вътре в него). Нека използваме Cheerio.js, за да анализираме HTML, който получихме по-рано, за да върнем списък с връзки към отделните страници на Уикипедия на американските президенти.

Изход:

Проверяваме, за да се уверим, че са върнати точно 45 елемента (броят на американските президенти), което означава, че няма други скрити „големи“ тагове другаде на страницата. Сега можем да преминем и да вземем списък с връзки към всички 45 президентски страници в Уикипедия, като ги вземем от раздела „attribs“ на всеки елемент.

Изход:

Сега имаме списък с всички 45 президентски страници в Уикипедия. Нека създадем нов файл (наречен potusParse.js), който ще съдържа функция за заемане на президентска страница в Уикипедия и връщане на името и рождения ден на президента. Първо, нека вземем суровия HTML от страницата на Уикипедия на Джордж Вашингтон.

Изход:

Нека отново използваме Chrome DevTools, за да намерим синтаксиса на кода, който искаме да анализираме, за да можем да извлечем името и рождения ден с Cheerio.js.

Така виждаме, че името е в клас, наречен „firstHeading“, а рожденият ден е в клас, наречен „bday“. Нека модифицираме нашия код, за да използваме Cheerio.js за извличане на тези два класа.

Изход:

Събирайки всичко

Перфектно! Сега нека увием това във функция и да го експортираме от този модул.

Сега да се върнем към оригиналния файл potusScraper.js и да изискваме модула potusParse.js. След това ще го приложим към списъка с wikiUrls, който събрахме по-рано.

Изход:

Оказване на JavaScript страници

Voilà! Списък с имената и рождените дни на всички 45 американски президенти. Използването само на модула за обещаване на заявки и Cheerio.js трябва да ви позволи да изстържете по-голямата част от сайтовете в интернет.

Напоследък обаче много сайтове започнаха да използват JavaScript за генериране на динамично съдържание на своите уебсайтове. Това създава проблем за заявка-обещание и други подобни HTTP библиотеки за заявки (като axios и fetch), тъй като те получават отговора само от първоначалната заявка, но не могат да изпълнят JavaScript по начина, по който може уеб браузърът.

По този начин, за да изстъргваме сайтове, които изискват изпълнение на JavaScript, се нуждаем от друго решение. В следващия ни пример ще получим заглавията за всички публикации на първата страница на Reddit. Нека да видим какво се случва, когато се опитаме да използваме заявка-обещание, както направихме в предишния пример.

Изход:

Ето как изглежда изходът:

Хммм ... не съвсем това, което искаме. Това е така, защото получаването на действителното съдържание изисква да стартирате JavaScript на страницата! С Puppeteer това не е проблем.

Puppeteer е изключително популярен нов модул, предоставен ви от екипа на Google Chrome, който ви позволява да управлявате браузър без глава. Това е идеално за програмно изстъргване на страници, които изискват изпълнение на JavaScript. Нека вземем HTML от първата страница на Reddit, като използваме Puppeteer, вместо да обещаем заявка.

Изход:

Хубаво! Страницата е изпълнена с правилното съдържание!

Сега можем да използваме Chrome DevTools, както в предишния пример.

Изглежда, че Reddit поставя заглавията в етикетите „h2“. Нека използваме Cheerio.js за извличане на h2 таговете от страницата.

Изход:

Допълнителни ресурси

И там е списъкът! В този момент трябва да се чувствате комфортно, като напишете първия си скрепер за събиране на данни от всеки уебсайт. Ето няколко допълнителни ресурси, които може да ви помогнат по време на вашето пътуване за изстъргване в мрежата:

  • Списък на прокси услугите за уеб изстъргване
  • Списък на удобните инструменти за изстъргване на уеб
  • Списък на уеб съвети за изстъргване
  • Сравнение на прокси за изстъргване в мрежата
  • Документация на Cheerio
  • Документация за кукловоди