Веб-скрейпинг на 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 критически важен для веб-скрапинга, поскольку он определяет, как обрабатываются запросы и ответы.

Получайте истории Data Journal на свою почту

При скрейпинге сайта обычно нужно сделать 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 скребок
cd скребок
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 главная(int argc, char **argv)
{
если (argc != 2)
{
std::cout << Пожалуйста, введите корректное английское слово << std::endl;
возврат EXIT_FAILURE;
}
std::string word = argv[1];
std::string page_content = запрос(word);
std::cout << scrape(page_content) << std::endl;
возврат EXIT_SUCCESS;
}

Эта функция проверяет, передано ли слово как аргумент командной строки, и вызывает функции request() и scrape().

Шаг 3: Функция запроса: получение HTML-содержимого

Чтобы получить HTML-содержимое сайта, мы используем libcurl. Функция request() отправляет HTTP-запрос на сайт и извлекает HTML-содержимое.

std::string запрос(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;
если (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_USERAGENT, "simple scraper");
// 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);
возврат new_size;
}));
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
// Perform the request
res_code = curl_easy_perform(curl);
если (res_code != CURLE_OK)
{
возврат curl_easy_strerror(res_code);
}
curl_easy_cleanup(curl);
}
возврат 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(), markup.длина(), 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);
если (result->nodesetval == NULL)
{
возврат Определений не найдено.;
}
для (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();
возврат res;
}

В этой функции мы разбираем HTML-содержимое, вычисляем выражение XPath, чтобы найти определения, и сохраняем результаты в строку.

Шаг 5: Вспомогательная функция для преобразования в нижний регистр

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

std::string strtolower(std::string str)
{
std::transform(str.begin(), str.конец(), str.begin(), ::tolower);
возврат str;
}

Эта функция просто приводит входную строку к нижнему регистру.

Компиляция и запуск скрейпера

Теперь, когда код готов, пора скомпилировать и запустить скрапер. Используйте следующую команду, чтобы скомпилировать код:

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

После компиляции запустите скрейпер с любым словом на ваш выбор. Например:

./scraper esoteric

В консоли должны появиться определения из словаря для слова «esoteric».

Лучшие ИИ-инструменты для веб-скрейпинга

Ищете больше вариантов, чтобы повысить эффективность сбора данных с помощью автоматизации или ИИ? Ознакомьтесь с лучшими ИИ-инструментами для веб-скрейпинга, доступными сегодня. За полезным разбором загляните в лучшие инструменты для веб-скрейпинга с ИИ и посмотреть, какие платформы выделяются, например Bright Data и ScrapingBee.

Заключение

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

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

Похожие записи