Вебскрапінг на C++ з libxml2 і libcurl

У цій статті я проведу вас через процес створення власного вебскрапера на C з використанням двох потужних бібліотек: libcurl для обробки HTTP-запитів і libxml2 для аналізу HTML. Давайте зануримося в тему й почнемо вебскрапінг!

Навіщо використовувати C для вебскрапінгу?

C відома своєю високою продуктивністю. Її швидкість робить її придатним вибором для завдань, що потребують швидкого вилучення та обробки даних, особливо під час роботи з великими наборами даних. Хоча такі мови, як Python, пропонують прості бібліотеки для вебскрапінгу, вони можуть не зрівнятися із сирою продуктивністю, яку забезпечує C.

Ключові переваги використання C для вебскрапінгу:

  1. Speed: C працює швидше за мови вищого рівня, як-от Python, що робить його ідеальним вибором, коли швидкість є критично важливим чинником.
  2. Керування ресурсами: C дає змогу безпосередньо керувати системними ресурсами, наприклад пам’яттю, що може допомогти оптимізувати продуктивність.
  3. Scalability: C може ефективно обробляти масштабні операції вебскрапінгу, що робить його ідеальним для вилучення даних із кількох джерел або великих сайтів.

Tools Needed

Щоб створити вебскрапер на C, вам потрібно буде встановити кілька бібліотек, які допоможуть із HTTP-запитами та розбором HTML.

  1. libcurl: Це потужна й широко використовувана бібліотека для виконання HTTP-запитів. Вона підтримує кілька протоколів, зокрема HTTP, HTTPS і FTP.
  2. libxml2: Ця бібліотека надає інструменти для аналізу XML- і HTML-документів. Вона підтримує XPath і XSLT, що робить її чудовим вибором для збирання даних із сайтів.
  3. C Compiler: стандартний компілятор C, такий як g (GCC) Потрібно для компіляції коду.

Налаштування середовища розробки

Перш ніж почати програмувати, вам потрібно налаштувати середовище розробки, встановивши потрібні бібліотеки.

Використання vcpkg (для Windows, macOS і Linux)

vcpkg — це кросплатформний менеджер пакетів, який спрощує встановлення таких бібліотек, як libcurl і libxml2.

Встановіть vcpkg у своїй системі. Дотримуйтеся інструкцій на сторінка vcpkg на GitHub.

Після встановлення відкрийте термінал і виконайте такі команди, щоб установити бібліотеки:

vcpkg install curl libxml2

Для користувачів Visual Studio виконайте таку команду, щоб інтегрувати vcpkg з MSBuild:

vcpkg integrate install

Використання apt (для Linux)

У системах на базі Debian, таких як Ubuntu, ви можете встановити libcurl і libxml2 безпосередньо за допомогою менеджера пакунків:

sudo apt-get install libcurl4-openssl-dev libxml2-dev

Основи HTTP: як працює вебскрапінг

Вебскрапінг починається з надсилання HTTP-запиту до сервера. Сервер відповідає HTTP-відповіддю, що містить потрібні дані, зазвичай у вигляді HTML-документа. Протокол HTTP є критично важливим для вебскрапінгу, оскільки він визначає, як обробляються запити та відповіді.

Get Data Journal’s stories in your inbox

Під час вебскрапінгу сайту вам зазвичай потрібно буде виконати GET запит, який отримує дані з сервера. Ось приклад того, як може виглядати запит до вебсайту:

GET /dictionary/esoteric HTTP/1.1
Host: www.merriam-webster.com
User-Agent: curl/8.9.1
Accept: */*

Once the server receives this request, it returns an HTTP response with a status code (e.g., 200 OK) and the requested content, which is usually an HTML page.

Створення вебскрапера

Тепер, коли ми розуміємо основи HTTP, перейдемо до створення вебскрапера.

Крок 1: Ініціалізуйте свій проєкт

Спочатку створіть каталог для свого проєкту:

mkdir scraper
cd scraper
touch scraper.cc

Це буде головний файл, у якому ми писатимемо код для нашого вебскрапера.

Крок 2: Написання головної функції

У C кожна програма починає виконання з функції main(). Тут ми напишемо функцію main, яка обробляє введення, викликає функції request і scrape та виводить результат.

#include 
#include 
#include 
#include <curl/curl.h>
#include <libxml/HTMLparser.h>
#include <libxml/xpath.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
std::cout << "Будь ласка, надайте дійсне англійське слово" << std::endl;
return EXIT_FAILURE;
}
std::string word = argv[1];
std::string page_content = request(word);
std::cout << scrape(page_content) << std::endl;
return EXIT_SUCCESS;
}

Ця функція перевіряє, чи передано слово як аргумент командного рядка, і викликає функції request() та scrape().

Крок 3: Функція запиту: отримання HTML-вмісту

Щоб отримати HTML-вміст із вебсайту, ми використаємо libcurl. Функція request() надсилає HTTP-запит до вебсайту та отримує HTML-вміст.

std::string request(std::string word)
{
CURLcode res_code = CURLE_FAILED_INIT;
CURL *curl = curl_easy_init();
std::string result;
std::string url = "https://www.merriam-webster.com/dictionary/"   word;
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_USERAGENT, "простий скрапер");
// Function to handle the response
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,
static_cast<size_t (*)(char *, size_t, size_t, std::string *)>(
[](char *contents, size_t size, size_t nmemb, std::string *data) -> size_t
{
size_t new_size = size * nmemb;
data->append(contents, new_size);
return new_size;
}));
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
// Perform the request
res_code = curl_easy_perform(curl);
if (res_code != CURLE_OK)
{
return curl_easy_strerror(res_code);
}
curl_easy_cleanup(curl);
}
return result;
}

Ця функція ініціалізує об’єкт libcurl, надсилає запит і отримує HTML-вміст словникової сторінки слова.

Крок 4: Функція scrape: вилучення даних за допомогою XPath

Тепер, коли в нас є HTML-вміст, нам потрібно витягти відповідні дані (визначення слів) за допомогою libxml2 і XPath.

std::string scrape(std::string markup)
{
std::string res = "";
// Parse the HTML content
htmlDocPtr doc = htmlReadMemory(markup.c_str(), розмітка.length(), NULL, NULL, HTML_PARSE_NOERROR);
xmlXPathContextPtr context = xmlXPathNewContext(doc);
// XPath to find the definitions
xmlXPathObjectPtr result = xmlXPathEvalExpression((xmlChar *)"//div[contains(@class, 'vg-sseq-entry-item')]/div[contains(@class, 'sb')]//span[contains(@class, 'dtText')]", context);
if (result->nodesetval == NULL)
{
return "Визначень не знайдено.";
}
for (int i = 0; i < result->nodesetval->nodeNr;   i)
{
char *def = (char *)xmlNodeGetContent(result->nodesetval->nodeTab[i]);
res  = def;
res  = "n";
free(def);
}
xmlFreeDoc(doc);
xmlCleanupParser();
return res;
}

У цій функції ми розбираємо HTML-вміст, обчислюємо XPath-вираз, щоб знайти визначення, і зберігаємо результати в рядку.

Крок 5: Допоміжна функція для перетворення в нижній регістр

Нам також потрібна допоміжна функція, щоб перетворити слово на нижній регістр перед надсиланням запиту на вебсайт.

std::string strtolower(std::string str)
{
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
return str;
}

Ця функція просто перетворює вхідний рядок на нижній регістр.

Компіляція та запуск вебскрапера

Тепер, коли код готовий, настав час скомпілювати та запустити вебскрапер. Скомпілюйте свій код за допомогою такої команди:

g   scraper.cc -lcurl -lxml2 -std=c  11 -o scraper

Після компіляції запустіть вебскрапер із будь-яким словом на ваш вибір. Наприклад:

./scraper esoteric

Ви маєте побачити вивід у консоль словникових визначень для слова “esoteric”.

Найкращі інструменти для вебскрапінгу на основі ШІ

Шукаєте більше варіантів, щоб посилити збір даних за допомогою автоматизації або штучного інтелекту? Ознайомтеся з найкращими інструментами для вебскрапінгу на основі ШІ, доступними сьогодні. Для корисного розбору перегляньте найкращі інструменти для вебскрапінгу на основі ШІ і подивіться, які платформи вирізняються, наприклад Bright Data та ScrapingBee.

Conclusion

У цьому посібнику ми розглянули, як створити власний вебскрапер мовою C з використанням libcurl і libxml2. Хоча для вебскрапінгу частіше використовують Python, C має суттєві переваги за продуктивністю та масштабованістю, особливо для завдань вебскрапінгу у великих обсягах. Ми також показали, як отримувати HTML-вміст із вебсайту, парсити його та витягувати потрібні дані за допомогою XPath.

Хоча цей приклад зосереджувався на відносно простому сценарії використання, вебскрапінг на C можна розширити, щоб обробляти складніші випадки, наприклад роботу з JavaScript, використання проксі або уникнення антискрапінгових механізмів. Використовуючи потужність C, ви можете створювати ефективні та масштабовані вебскрапери для будь-якої задачі з вилучення даних.

Схожі записи