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;
}