Вебскрапінг на C у 2026 році
У цьому простому посібнику я покажу, як я створюю вебскрапер на C. Я проведу вас через отримання HTML зі сторінки, вибір потрібної мені інформації за допомогою XPathі збереження всього у файл CSV. Спочатку це може здаватися складним, але з правильними інструментами й кроками це цілком реально — навіть у 2025 році. Поїхали!
Навіщо використовувати C для вебскрапінгу у 2025 році?
Попри те, що C вже понад пів століття, він залишається справжнім продуктивним гігантом. Вебскрапінг на C може здаватися нетиповим, але його переваги очевидні:
- Надшвидке виконання: Ідеально підходить для вебскрапінгу сайтів із великим обсягом даних або важким контентом.
- Точний контроль над ресурсами: Мінімізуйте використання пам’яті та CPU.
- Низькорівневе налагодження та оптимізація: Легко виявляйте вузькі місця.
- Краща інтеграція: C можна використовувати у вбудованих системах, мікроконтролерах або високопродуктивних кластерах.
Розглядаєте інші підходи?
Хоча C дає вам максимальний контроль і продуктивність, вона може вимагати значного налаштування та супроводу — особливо в міру розвитку вебтехнологій. Якщо вам потрібно витягувати дані з динамічних, захищених або швидкозмінних сайтів, сучасні платформи для вебскрапінгу, як-от рішення від Bright Data, можуть спростити процес.
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 main() {
printf("Вебскрапінг на C - 2025!n");
return 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);
if (!ptr) return 0;
mem->html = ptr;
memcpy(&(mem->html[mem->size]), contents, realsize);
mem->size = realsize;
mem->html[mem->size] = 0;
return 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);
return 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) {
return htmlReadMemory(html, size, NULL, NULL, HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING);
}
xmlXPathObjectPtr GetNodesByXPath(htmlDocPtr doc, const char *xpathExpr) {
xmlXPathContextPtr context = xmlXPathNewContext(doc);
return xmlXPathEvalExpression((xmlChar *)xpathExpr, context);
}
Крок 5: Визначте структуру даних
Використайте struct для зберігання даних про продукт:
typedef struct {
char *url;
char *image;
char *name;
char *price;
} Product;
#define MAX_PRODUCTS 192
Крок 6: Збір даних про товари
Припустімо, ви займаєтеся вебскрапінгом демосайту e-commerce зі структурованим 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;
for (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);
return count;
}
Крок 7: Експорт даних у CSV
Після того як ви зібрали дані, експортуйте їх:
void ExportToCSV(Product *products, int count) {
FILE *fp = fopen("products.csv", "w");
fprintf(fp, "url,image,name,pricen");
for (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 main() {
curl_global_init(CURL_GLOBAL_ALL);
Product products[MAX_PRODUCTS];
int totalCount = 0;
for (int page = 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);
for (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();
return 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 через відсутність безголового рушія браузера, є два способи обійти це:
- Використовуйте проміжні сервіси рендерингу (провайдери HTML-знімків).
- Винести рендеринг JavaScript до інших сервісів і обробляйте в C лише сирий HTML.
Існують нові проєкти, що досліджують легке безголове рендерення в C або C++, але C найкраще використовувати для статичних або напівстатичних сайтів, де потрібна сирa продуктивність.
Conclusion
Вебскрапінг із C у 2025 році — це переконлива, хоч і просунута практика. Він забезпечує неперевершену швидкість і контроль, що робить його ідеальним для спеціалізованих застосунків, де має значення кожен байт пам’яті та кожна мілісекунда. Використовуючи потужні бібліотеки на кшталт libcurl і libxml2 та дотримуючись принципів відповідального вебскрапінгу, ви можете створювати надійні й ефективні рішення для вебскрапінгу на C.
Чи то ви займаєтеся вебскрапінгом сторінок e-commerce, збираєте дані для досліджень, чи вбудовуєте логіку вебскрапінгу в обмежене середовище, C і далі залишається високопродуктивним інструментом у вашому арсеналі розробника.

