曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 10716|回复: 0
打印 上一主题 下一主题

[Curl] 【C语言】在 curl 中保存获取的页面内容

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-8-14 11:24:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一般情况下,使用 curl 获取一个页面时,所获取的页面内容是输出到标准输出的,如果是在 shell 里,那么容易处理该情况,即只需要把这些输出从定向到一个文本里就行。但是如果在 C 语言中,想要保存获取的数据,那么就需要用到 curl_easy_setopt()  函数里的 CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA 这两个选项。

其中 CURLOPT_WRITEFUNCTION  是要指定一个回调函数,正是利用该回调函数我们可以将结果保存;而 CURLOPT_WRITEDATA 选项用来指定一个流指针,然后将该指针传递给回调函数中作为参数。

指定的回调函数的格式如下:
size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);
一旦有要保存的数据传送过来时,libcurl 会自动调用该函数。这些被传递过来的数据由第 1 个参数 ptr 所指向;第 2 个和第 3 个参数的乘积(size * nmemb)是这些数据的大小;第 4 个参数 userdata 要设置为指定 CURLOPT_WRITEDATA 时所指定的第 3 个参数。

下面用一个实例来演示上面的情况:
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <curl/curl.h>

size_t save_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;

    fp = fopen("Getdata.txt", "wb");

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.groad.net/index.html");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, save_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }

    return 0;
}

运行输出:
[beyes@beyes   curl]$ ./curl_save_data
[beyes@beyes   curl]$ ls
curl_save_data  curl_save_data.c  Getdata.txt
[beyes@beyes   curl]$ cat Getdata.txt
<html>
<head>
<meta name="keywords" content="曲径通幽,曲径通幽论坛,Linux编程,技术交流社区" />
<meta name="description" content="曲径通幽技术交流社区" />
<meta http-equiv="refresh" content="0;url=http://www.groad.net/bbs/index.php">
<title>Welcome To Groad.Net</title>
</head>
</html>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 06:21 , Processed in 0.071698 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表