c - 如何在 C 中使用 libcurl 获取 HTML 页面源代码

标签 c curl libcurl

我试过查看 libcurl 网站上的简单示例,可在以下网址找到:http://curl.haxx.se/libcurl/c/simple.html ,但是我还没有想出如何做我需要的,即将页面的源存储在一个字符串变量中。

如有任何帮助,我们将不胜感激。

最佳答案

您很可能想调用 curl_easy_setopt ,带有 CURLOPT_WRITEFUNCTION 选项。这允许您使用此原型(prototype)提供函数:

size_t function( void *ptr, size_t size, size_t nmemb, void *userdata);

有数据时会调用哪个curl。然后,您可以使用 userdata 参数传入指向 std::string(如果在 C++ 中)或 char ** 的指针C,它允许您将数据保存到内存中。或者,您可以直接处理传入的数据,而无需完全存储它。

编辑: 这是我曾为 C++ 编写的这样一个函数(它使用 std::string)这是我的代码,但是如果你需要许可信息,它是公共(public)领域——用它做任何你想做的事。 :-)

size_t curl_to_string(void *ptr, size_t size, size_t nmemb, void *data)
{
    std::string *str = (std::string *) data;
    char *sptr = (char *) ptr;
    int x;

    for(x = 0; x < size * nmemb; ++x)
    {
        (*str) += ptr[x];
    }

    return size * nmemb;
}

可能应该使用 C++ 风格的转换,但那时我还是一个年轻的程序员。 :-) 您可以像这样使用上面的内容:

curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curl_to_string);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &pagedata);

其中 pagedata 是一个 std::string。在调用 curl_easy_perform 后,如果没有错误,pagedata 就会有您的页面。

编辑 2: 这个的 C 版本稍微复杂一些,主要是因为我们必须管理内存以适应传入的数据。 (像 std::stringstd::vector 这样的东西在 C++ 中为我们做了...)

typedef struct
{
    size_t size;
    size_t allocated;
    char *data;
} c_vector;

size_t curl_to_string(void *ptr, size_t size, size_t nmemb, void *data)
{
    if(size * nmemb == 0)
        return 0;

    c_vector *vec = (c_vector *) data;

    // Resize the data array if needed
    if(vec->size + size * nmemb > allocated)
    {
        char *new_data = realloc(vec->data, sizeof(char) * (vec->size + size * nmemb));
        if(!new_data)
            return 0;
        vec->data = new_data;
        vec->allocated = vec->size + size * nmemb;
    }

    memcpy(vec->data + vec->size, ptr, size * nmemb);
    vec->size += size * nmemb;

    return size * nmemb;
}

它基本上是 C++ 的 std::vector,归结为 C。(这样的事情就是为什么我默认是 C++ 程序员而不是 C...)

你可以这样调用它,

c_vector vec = {0};

curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curl_to_string);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &pagedata);

注意上述代码中的错误;我只是证明了它是正确的,没有尝试过。

关于c - 如何在 C 中使用 libcurl 获取 HTML 页面源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525613/

相关文章:

c - Linux 上的 "Alarm clock"消息

php - 是否需要关闭 cURL 连接?

node.js - PUT 的 Node JS 请求 promise

Java - 使用运行时运行curl命令被代理阻止

c - 在 C 中的 for 循环中使用多个 curl

c - 使用 libcurl 创建独立的站点轮询程序

有人可以解释为什么我遇到段错误 11 吗?

c++ - 将浮点 vector 转换为 16 位 int 而不饱和

C 中的编译错误只是因为缩进?

c++ - libcurl C++ 的内存访问错误