让libcurl只返回来自某个站点的指定数量的HTML

前端开发 2026-07-09

我不想要来自某个特定站点的全部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将输出写入文件。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章