news 2026/5/12 9:46:35

C语言编写轻量爬虫工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言编写轻量爬虫工具

当我们要使用C语言编写一个定制化轻量爬虫工具,得需要结合网络请求、HTML解析和数据处理等步骤。由于是轻量级,正常情况下我们将使用C语言标准库以及一些第三方库来简化开发。这样省时省力,生态丰富可以帮助大家少走很多弯路。具体细节可以看下面具体细节。

下面是一个分步指南和示例代码:

核心组件

1、网络请求:使用libcurl库获取网页内容

2、HTML解析:使用libxml2解析HTML

3、数据存储:将结果保存到文件或内存

4、定制规则:通过回调函数实现定制逻辑

完整示例代码

代码语言:javascript

AI代码解释

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #include <libxml/HTMLparser.h> #include <libxml/xpath.h> ​ // 存储HTTP响应数据 struct MemoryStruct { char *memory; size_t size; }; ​ // libcurl回调函数 static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)userp; ​ char *ptr = realloc(mem->memory, mem->size + realsize + 1); if(!ptr) { fprintf(stderr, "内存分配失败\n"); return 0; } ​ mem->memory = ptr; memcpy(&(mem->memory[mem->size]), contents, realsize); mem->size += realsize; mem->memory[mem->size] = 0; ​ return realsize; } ​ // 提取链接的回调函数类型定义 typedef void (*LinkHandler)(const char* url, void* userdata); ​ // 核心爬取函数 void crawl_page(const char* url, LinkHandler handler, void* userdata) { CURL *curl; CURLcode res; struct MemoryStruct chunk = {0}; ​ curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { // 设置cURL选项 curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; MyCrawler/1.0)"); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); ​ // 执行请求 res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(res)); } else { // 解析HTML文档 htmlDocPtr doc = htmlReadDoc((xmlChar*)chunk.memory, url, NULL, HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); if (doc) { xmlXPathContextPtr context = xmlXPathNewContext(doc); if (context) { // 查找所有<a>标签 xmlXPathObjectPtr result = xmlXPathEvalExpression((xmlChar*)"//a/@href", context); if (result) { xmlNodeSetPtr nodeset = result->nodesetval; for (int i = 0; i < nodeset->nodeNr; i++) { xmlChar *href = xmlNodeListGetString(doc, nodeset->nodeTab[i]->children, 1); if (handler && href) { handler((const char*)href, userdata); } xmlFree(href); } xmlXPathFreeObject(result); } xmlXPathFreeContext(context); } xmlFreeDoc(doc); } } curl_easy_cleanup(curl); } free(chunk.memory); curl_global_cleanup(); } ​ // 示例链接处理函数 void print_links(const char* url, void* userdata) { FILE *output = (FILE*)userdata; fprintf(output, "发现链接: %s\n", url); } ​ // 主函数 int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "用法: %s <目标URL> <输出文件>\n", argv[0]); return 1; } ​ FILE *output = fopen(argv[2], "w"); if (!output) { perror("无法打开输出文件"); return 1; } ​ fprintf(output, "爬取结果: %s\n", argv[1]); crawl_page(argv[1], print_links, output); ​ fclose(output); printf("爬取完成!结果已保存至 %s\n", argv[2]); return 0; }
编译与运行

1、安装依赖库

代码语言:javascript

AI代码解释

# Ubuntu/Debian sudo apt-get install libcurl4-openssl-dev libxml2-dev

2、编译程序

代码语言:javascript

AI代码解释

gcc -o mycrawler mycrawler.c -lcurl -lxml2

3、运行示例

代码语言:javascript

AI代码解释

./mycrawler https://example.com output.txt
定制化扩展方向

1、过滤特定链接

代码语言:javascript

AI代码解释

void filter_links(const char* url, void* userdata) { if (strstr(url, ".pdf")) { printf("跳过PDF文件: %s\n", url); return; } // 其他处理... }

2、限制爬取深度

代码语言:javascript

AI代码解释

// 添加depth参数到crawl_page函数 void crawl_page(const char* url, LinkHandler handler, void* userdata, int depth) { if (depth <= 0) return; // ...获取页面内容... // 递归爬取子链接 crawl_page(new_url, handler, userdata, depth-1); }

3、数据提取

代码语言:javascript

AI代码解释

// 修改XPath表达式提取其他数据 xmlXPathEvalExpression((xmlChar*)"//h1/text()", context);

4、多线程支持

  • 使用pthread库创建线程池
  • 实现线程安全的队列管理URL
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 9:40:40

Stagecraft:用设计规范与工作流指南,让AI代码助手生成高级感UI

1. 项目概述&#xff1a;当AI代码助手学会“设计品味”最近在折腾各种AI代码助手&#xff08;Claude Code、Cursor、GitHub Copilot&#xff09;时&#xff0c;我一直在琢磨一件事&#xff1a;这些工具生成代码的速度是快&#xff0c;但出来的UI界面&#xff0c;总感觉差了那么…

作者头像 李华
网站建设 2026/5/12 9:40:38

炉石传说HsMod插件:55个实用功能解决你的游戏痛点

炉石传说HsMod插件&#xff1a;55个实用功能解决你的游戏痛点 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 还在为炉石传说游戏体验不佳而烦恼吗&#xff1f;HsMod这款基于BepInEx框架的…

作者头像 李华
网站建设 2026/5/12 9:36:11

ImageGlass:免费开源的Windows图像浏览器终极解决方案

ImageGlass&#xff1a;免费开源的Windows图像浏览器终极解决方案 【免费下载链接】ImageGlass &#x1f3de; A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 在Windows平台上寻找一款既轻量又功能全面的图像浏览器&a…

作者头像 李华
网站建设 2026/5/12 9:35:08

Shell脚本安全增强工具sh-guard:超越ShellCheck的自动化防护实践

1. 项目概述&#xff1a;一个为Shell脚本注入安全与规范的守护者如果你和我一样&#xff0c;日常工作中需要编写、维护大量的Shell脚本&#xff0c;那你一定对脚本的安全性和规范性问题深有感触。一个看似简单的脚本&#xff0c;可能因为变量未加引号、路径处理不当、或者缺少必…

作者头像 李华