1、使用 libcurl
libcurl 是一个广泛使用的库,提供了高层次的接口来发送 HTTP 请求和处理响应。功能强大的开源库,支持多种网络协议,包括HTTP、FTP等。在C语言中,它常用于实现网络爬虫。
#include
#include
#include
#include
struct MemoryStruct {
char *memory;
size_t size;
};
size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, struct MemoryStruct *userp) {
size_t realsize = size * nmemb;
userp->memory = realloc(userp->memory, userp->size + realsize + 1);
if (userp->memory == NULL) {
printf("无法分配内存\n");
return 0;
}
memcpy(&(userp->memory[userp->size]), contents, realsize);
userp->size += realsize;
userp->memory[userp->size] = '\0';
return realsize;
}
int main(void) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
struct MemoryStruct chunk = {malloc(1), 0};
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
res = curl_easy_perform(curl);
if (res == CURLE_OK) {
printf("%s\n", chunk.memory);
} else {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
free(chunk.memory);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
2、使用 POSIX Socket
POSIX Socket 是一个跨平台的网络编程接口,它提供了一组函数,用于创建、连接、发送和接收网络数据。使用 POSIX Socket,可以直接与网络服务器进行通信,实现网络爬虫的功能。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> int main() { int sock; struct sockaddr_in server; char request[1024], response[4096]; // 创建 socket sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("无法创建 socket"); return 1; } server.sin_family = AF_INET; server.sin_port = htons(80); inet_pton(AF_INET, "93.184.216.34", &server.sin_addr); // example.com 的 IP 地址 // 连接服务器 if (connect(sock, (struct sockaddr *)&server, sizeof(server)) == -1) { perror("连接失败"); return 1; } // 构建 HTTP GET 请求 sprintf(request, "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n"); send(sock, request, strlen(request), 0); // 接收响应 while (recv(sock, response, sizeof(response) - 1, 0) > 0) { printf("%s", response); memset(response, 0, sizeof(response)); } close(sock); return 0; }
3、使用系统调用
使用 system
调用外部命令行工具(如 curl
)进行网络请求。这是一种快速的解决方案,但不够灵活。
#include <stdio.h> #include <stdlib.h> int main() { // 使用 system 调用 curl 命令 int result = system("curl http://example.com"); if (result == -1) { perror("命令执行失败"); } return 0; }