Ключевые возможности Octoparse включают поддержку динамических веб-страниц, извлечение данных в режиме point-and-click, облачный скрейпинг и гибкие варианты экспорта данных, например в CSV, Excel или JSON. Инструмент также предлагает облачное хранение собранных данных, что позволяет управлять проектами из любой точки.

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-браузера, есть два способа обойти это:

  1. Используйте промежуточные сервисы рендеринга (провайдеры HTML-снимков).
  2. Перенесите рендеринг JavaScript в отдельный процесс передавать рендеринг другим сервисам и обрабатывать в C только сырой HTML.

Появляются проекты, исследующие облегчённый рендеринг в headless-режиме на C или C++, но C лучше всего использовать для статических или полу-статических сайтов, где требуется высокая производительность.

Заключение

Веб-скрейпинг на C в 2025 году — это привлекательная, но продвинутая практика. Он обеспечивает непревзойдённые скорость и контроль, что делает его идеальным для специализированных сценариев, где на счету каждый байт памяти и каждая миллисекунда. Используя мощные библиотеки вроде libcurl и libxml2 и придерживаясь принципов ответственного скрейпинга, вы можете создавать в C надёжные и эффективные решения для сбора данных.

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

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