使用libcurl库(带gzip)抓取gzip压缩的网页源代码,在末尾处比网页源代码多出来一部分

jdgdf566 2016-04-05 10:10:05
使用libcurl库(libcurl/7.37.0 OpenSSL/1.0.1h zlib/1.2.8 WinIDN)抓取网页源代码。通过header信息和抓包软件确认返回的是gzip压缩的数据。libcurl也是自动解压缩的,得到的不是二进制的乱码而是网页源代码。但是有个问题,在末尾处比网页源代码多出来一部分。如果返回的不是压缩数据则没有这个问题。下面只列出有区别的代码,主要是两个回调函数:
回调函数如下:

/*通过设置CURLOPT_WRITEDATA把一个FILE指针代入userdata*/
static size_t contentCallback(void * buffer, size_t size, size_t nmemb, void * userdata)
{
fwrite(buffer, size, nmemb, (FILE*)userdata);
return size * nmemb;
}

通过设置CURLOPT_WRITEDATA把一个FILE指针代入userdata。运行后文件中的内容与网页源代码一致。程序正确。
我需要在程序里面处理源代码,而不是输出到一个文件,所以把程序改为通过设置CURLOPT_WRITEDATA把一个char数组指针代入userdata,如下所示。

char content[350000] = {0}; //空间是足够的
/*通过设置CURLOPT_WRITEDATA把一个content指针代入userdata*/
static size_t contentCallback(void * buffer, size_t size, size_t nmemb, void * userdata)
{
strcat((char*)userdata, (char*)buffer);
return size * nmemb;
}

运行后,无论是把content打印出来还是输出到文件,都发现在末尾处比网页源代码多出来一部分,多出来的部分属于网页源代码的一部分。
...全文
257 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdgdf566 2016-04-07
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
说明size和nmemb的值不对或350000不够。
一个response内,回调函数会被调用多次
赵4老师 2016-04-06
  • 打赏
  • 举报
回复
说明size和nmemb的值不对或350000不够。
jdgdf566 2016-04-05
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:

static char  content[350000] = {0};  //空间是足够的
/*通过设置CURLOPT_WRITEDATA把一个content指针代入userdata*/
static size_t contentCallback(void * buffer, size_t size, size_t nmemb, void * userdata)
{
    memcpy((void*)userdata, (void*)buffer,__min(size * nmemb,350000));
    return size * nmemb;
}

更不对了,只取到网页源代码的中间的某一部分。
赵4老师 2016-04-05
  • 打赏
  • 举报
回复

static char  content[350000] = {0};  //空间是足够的
/*通过设置CURLOPT_WRITEDATA把一个content指针代入userdata*/
static size_t contentCallback(void * buffer, size_t size, size_t nmemb, void * userdata)
{
    memcpy((void*)userdata, (void*)buffer,__min(size * nmemb,350000));
    return size * nmemb;
}

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧