1

最近我正在用libcurl构建一个从互联网上抓取网页的程序,我发现当使用分块编码的响应时,libcurl无法获取块头。然后我查看了libcurl在线文档,它说块头由WriteFunction处理,我我正在使用 libcurl 版本 2.18,并且我为 CURLOPT_WRITEFUNCTION 和 CURLOPT_HEADERFUNCTION 设置了回调,除了块头的单个字符之外,他们得到了任何东西,关于块编码的 libcurl 有问题吗?我怎样才能让它正常工作?谢谢ps 我要抓取的网站是http://list.taobao.com/browse/cat-0.htm,这是一个使用gbk编码的中文网站

这是我对 cliburl 所做的设置

int32_t progress = 0;
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_NOPROGRESS, progress) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HEADER, 1) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_DEBUGFUNCTION, &HttpSpider::curl_debug_callback) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HTTP_TRANSFER_DECODING, 1) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_WRITEFUNCTION, &HttpSpider::_ProcessRecvString) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HEADERFUNCTION, &HttpSpider::_ProcessRecvHeader) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_PROGRESSFUNCTION, &HttpSpider::_ProcessRecvProgress) == CURLE_OK);

//这里有其他东西

result = curl_easy_setopt(inst->handle_, CURLOPT_HTTPGET, 1);
result = curl_easy_setopt(inst->handle_, CURLOPT_PROGRESSDATA, param);
result = curl_easy_setopt(inst->handle_, CURLOPT_WRITEDATA, param);
result = curl_easy_setopt(inst->handle_, CURLOPT_WRITEHEADER, param);
result = curl_easy_setopt(inst->handle_, CURLOPT_URL, *url);

printf("/**********     HTTP GET     **********/\n");
//try to perform a post action
result = curl_easy_perform(inst->handle_);  

回调是根据需要声明的,缓冲区中有块长度传递给调试函数,但在 writefunction 中没有,我如何在 writefunction 中获取它

4

1 回答 1

0

libcurl 自动且无条件地支持分块编码,而无需应用程序执行任何操作。

如果您仍然没有获得任何数据,则存在某种问题/错误/问题...

于 2011-11-13T21:58:52.987 回答