6 лучших альтернатив Apify в 2025 году
В этом простом руководстве я покажу, как создаю веб-скрапер на C. Я проведу вас через получение HTML со страницы и извлечение нужной информации с помощью XPath, и сохранение всего в CSV-файл. Сначала это может показаться сложным, но с правильными инструментами и шагами это вполне реально — даже в 2025 году. Давайте разберёмся!
Зачем использовать C для веб-скрейпинга в 2025 году?
Хотя C существует уже более пятидесяти лет, он по-прежнему остается мощнейшим языком с точки зрения производительности. Веб-скрапинг на C может показаться нетипичным, но его преимущества очевидны:
- Молниеносное выполнение: Идеально подходит для скрейпинга сайтов с большим объёмом данных или тяжёлым контентом.
- Точный контроль над ресурсами: Минимизируйте потребление памяти и CPU.
- Низкоуровневая отладка и оптимизация: Легко выявлять узкие места.
- Лучшая интеграция: C можно использовать во встраиваемых системах, микроконтроллерах или высокопроизводительных кластерах.
Рассматриваете другие подходы?
Хотя C обеспечивает максимальный контроль и производительность, он может требовать существенной настройки и поддержки — особенно по мере развития веб-технологий. Если вам нужно извлекать данные с динамических, защищённых или быстро меняющихся сайтов, современные платформы для веб-скрапинга, такие как решения от Bright Data, могут заметно упростить процесс.
Яркие данные и другие провайдеры предлагают решения вроде управляемых прокси-сетей, браузерной автоматизации и готовые API. Они могут помочь автоматизировать задачи скрапинга, справляться со сложными сайтами и экономить время разработки. В зависимости от вашего сценария имеет смысл рассмотреть эти варианты наряду с подходом на C.
Пошагово: создание веб-скрейпера на C
Необходимые инструменты:
Установите эти зависимости с помощью пакетного менеджера, например vcpkg или менеджер пакетов вашей системы:
vcpkg install curl libxml2
Или для систем Ubuntu/Debian:
sudo apt-get install libcurl4-openssl-dev libxml2-dev
Вам понадобятся:
- libcurl — для выполнения HTTP-запросов
- libxml2 — для парсинга HTML с помощью XPath
Шаг 1: Установка зависимостей
Прежде чем переходить к коду, подготовьте окружение.
On Linux/macOS:
sudo apt install libcurl4-openssl-dev libxml2-dev
On Windows с помощью vcpkg:
vcpkg install curl libxml2
Убедитесь, что ваше окружение разработки настроено на линковку с этими библиотеками.
Шаг 2: Настройка базового скрапера на C
Create a file called scraper.c. Start with the basic includes and a “Hello World” to verify your setup:
#include
#include
#include <curl/curl.h>
#include <libxml/HTMLparser.h>
#include <libxml/xpath.h>
int главная() {
printf("Web Scraping in C - 2025!n");
возврат 0;
}
Скомпилируйте с помощью:
gcc scraper.c -o scraper -lcurl -lxml2
Если всё работает, можно приступать.
Шаг 3: Получение веб-страниц с помощью libcurl
Далее напишите функцию для выполнения HTTP GET-запросы и получить HTML:
struct CURLResponse {
char *html;
size_t size;
};
static size_t WriteHTMLCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct CURLResponse *mem = (struct CURLResponse *)userp;
char *ptr = realloc(mem->html, mem->size realsize 1);
если (!ptr) возврат 0;
mem->html = ptr;
memcpy(&(mem->html[mem->size]), contents, realsize);
mem->size = realsize;
mem->html[mem->size] = 0;
возврат realsize;
}
struct CURLResponse GetHTML(const char *url) {
CURL *curl = curl_easy_init();
struct CURLResponse res = {.html = malloc(1), .size = 0};
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteHTMLCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&res);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
возврат res;
}
Now you can call GetHTML(“https://example.com”) and retrieve the raw HTML.
Шаг 4: Парсинг HTML с помощью libxml2
Let’s extract meaningful content from the fetched HTML using XPath queries.
htmlDocPtr ParseHTML(const char *html, size_t size) {
возврат htmlReadMemory(html, size, NULL, NULL, HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING);
}
xmlXPathObjectPtr GetNodesByXPath(htmlDocPtr doc, const char *xpathExpr) {
xmlXPathContextPtr context = xmlXPathNewContext(doc);
возврат xmlXPathEvalExpression((xmlChar *)xpathExpr, context);
}
Шаг 5: Определите структуру данных
Используйте структуру для хранения данных о продукте:
typedef struct {
char *url;
char *image;
char *name;
char *price;
} Product;
#define MAX_PRODUCTS 192
Шаг 6: Сбор данных о товарах
Предположим, вы скрапите демо-сайт электронной коммерции со структурированным HTML. Вот как извлечь информацию о товарах:
int ExtractProducts(htmlDocPtr doc, Product *products, int startIndex) {
xmlXPathContextPtr context = xmlXPathNewContext(doc);
xmlXPathObjectPtr items = xmlXPathEvalExpression((xmlChar *)"//li[contains(@class,'product')]", context);
int count = 0;
для (int i = 0; i < items->nodesetval->nodeNr; i) {
xmlNodePtr node = items->nodesetval->nodeTab[i];
xmlXPathSetContextNode(node, context);
char *url = (char *)xmlGetProp(xmlXPathEvalExpression((xmlChar *)".//a", context)->nodesetval->nodeTab[0], (xmlChar *)"href");
char *img = (char *)xmlGetProp(xmlXPathEvalExpression((xmlChar *)".//a/img", context)->nodesetval->nodeTab[0], (xmlChar *)"src");
char *name = (char *)xmlNodeGetContent(xmlXPathEvalExpression((xmlChar *)".//a/h2", context)->nodesetval->nodeTab[0]);
char *price = (char *)xmlNodeGetContent(xmlXPathEvalExpression((xmlChar *)".//a/span", context)->nodesetval->nodeTab[0]);
products[startIndex count].url = strdup(url);
products[startIndex count].image = strdup(img);
products[startIndex count].name = strdup(name);
products[startIndex count].price = strdup(price);
count ;
free(url); free(img); free(name); free(price);
}
xmlXPathFreeContext(context);
xmlXPathFreeObject(items);
возврат count;
}
Шаг 7: Экспорт данных в CSV
После того как вы собрали данные, экспортируйте их:
void ExportToCSV(Product *products, int count) {
FILE *fp = fopen("products.csv", "w");
fprintf(fp, "url,image,name,pricen");
для (int i = 0; i < count; i ) {
fprintf(fp, ""%s","%s","%s","%s"n",
products[i].url, products[i].image, products[i].name, products[i].price);
}
fclose(fp);
}
Шаг 8: Обход нескольких страниц
Многие сайты разбивают товары на страницы. Например:
https://example.com/products/page/1/
https://example.com/products/page/2/
Переберите эти страницы:
#define TOTAL_PAGES 5
int главная() {
curl_global_init(CURL_GLOBAL_ALL);
Product products[MAX_PRODUCTS];
int totalCount = 0;
для (int страница = 1; page <= TOTAL_PAGES; page) {
char url[256];
snprintf(url, sizeof(url), "https://example.com/products/page/%d/", page);
struct CURLResponse res = GetHTML(url);
htmlDocPtr doc = ParseHTML(res.html, res.size);
int count = ExtractProducts(doc, products, totalCount);
totalCount = count;
xmlFreeDoc(doc);
free(res.html);
}
ExportToCSV(products, totalCount);
для (int i = 0; i < totalCount; i ) {
free(products[i].url);
free(products[i].image);
free(products[i].name);
free(products[i].price);
}
curl_global_cleanup();
возврат 0;
}
Методы противодействия скрапингу в 2025 году
В 2025 году сайты стали умнее. Нужно учитывать:
- Лимиты по частоте запросов: Добавляйте задержки между запросами. В качестве альтернативы посмотрите мой список лучшие ротирующиеся прокси.
- Headers: Используйте реалистичные значения заголовков User-Agent, Accept и Referer.
- Сессионные cookie: При необходимости сохраняйте cookies между запросами.
- CAPTCHAs: Их сложнее обойти на C без браузерной автоматизации. Посмотрите мою статью о лучших Инструменты для решения CAPTCHA.
Вот как имитировать реальный браузер с помощью заголовков:
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_slist_append(NULL, “Accept: text/html”));
Будущее веб-скрапинга на C
Хотя динамические сайты на JavaScript нативно не поддерживаются в C из-за отсутствия движка headless-браузера, есть два способа обойти это:
- Используйте промежуточные сервисы рендеринга (провайдеры HTML-снимков).
- Перенесите рендеринг JavaScript в отдельный процесс передавать рендеринг другим сервисам и обрабатывать в C только сырой HTML.
Появляются проекты, исследующие облегчённый рендеринг в headless-режиме на C или C++, но C лучше всего использовать для статических или полу-статических сайтов, где требуется высокая производительность.
Заключение
Веб-скрейпинг на C в 2025 году — это привлекательная, но продвинутая практика. Он обеспечивает непревзойдённые скорость и контроль, что делает его идеальным для специализированных сценариев, где на счету каждый байт памяти и каждая миллисекунда. Используя мощные библиотеки вроде libcurl и libxml2 и придерживаясь принципов ответственного скрейпинга, вы можете создавать в C надёжные и эффективные решения для сбора данных.
Независимо от того, скрапите ли вы страницы интернет-магазинов, собираете данные для исследований или встраиваете логику скрапинга в ограниченную среду, C по-прежнему остается высокопроизводительным инструментом в вашем арсенале разработчика.

