让libcurl只返回来自某个站点的指定数量的HTML
我不想要来自某个特定站点的全部HTML,所以我尝试修改CURL_MAX_WRITE_SIZE。
不幸的是,它仍然返回远超650,000字符的内容,并给出整个站点。
#include <stdio.h>
#include <curl/curl.h>
#ifdef CURL_MAX_WRITE_SIZE
#undef CURL_MAX_WRITE_SIZE
#define CURL_MAX_WRITE_SIZE 650000
#endif
//for now this just prints the code for debugging purposes
int processCode(char html[]){
printf("%s", html);
return 0;
}
int main(){
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "https://amazon.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 650000L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, processCode);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
return 0;
}
解决方案
这里的代码在我的机器上可以编译,gcc没有报错,输出的文件也能运行,只是方式不是我希望的那样。
欢迎来到C 语言世界,这里的编译器也不能总是救你,哪怕你再严格地让它检查代码。
你的 processCode() 函数有问题。原因在于 curl_easy_setopt() 函数的定义方式——第三个参数可以是任何能够被强制转换为 void * 的值。 (严格来说,将函数指针强制转换为 void * 在C 标准下其实有点不太妥当...)
根据 libcurl 文档(加粗文本为本人添加):
名称
CURLOPT_WRITEFUNCTION - 用于写入接收到的数据的回调函数
概述
include
size_t write_callback(char ptr, size_t size, size_t nmemb, void userdata);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);
描述
将指针传递给你的回调函数,它应与上面给出的原型匹配。
当libcurl收到需要保存的数据时会调用这个回调函数。对于大多数传输来说,这个回调会被调用多次,每次调用都会传来另一块数据。ptr指向传送的数据,数据的大小是nmemb;size始终为1。
传递给此函数的数据不是以空字符结尾的。
...
在 该页面 上有一个示例:
#include <stdlib.h> /* for realloc */
#include <string.h> /* for memcpy */
struct memory {
char *response;
size_t size;
};
static size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
{
size_t realsize = nmemb;
struct memory *mem = (struct memory *)clientp;
char *ptr = realloc(mem->response, mem->size + realsize + 1);
if(!ptr)
return 0; /* out of memory */
mem->response = ptr;
memcpy(&(mem->response[mem->size]), data, realsize);
mem->size += realsize;
mem->response[mem->size] = 0;
return realsize;
}
不过如果你想把输出收集到内存缓冲区中,使用 CURLOPT_WRITEDATA 会容易得多,FILE * 参数是通过使用 POSIX open_memstream() 函数 打开的内存流。
不过你最好从那一页的示例开始——那会教你如何使用libcurl将输出写入文件。