C++ cURL - 如何将完整的网页保存到文件中?

Posted

技术标签:

【中文标题】C++ cURL - 如何将完整的网页保存到文件中?【英文标题】:C++ cURL - how to save a full webpage to a file? 【发布时间】:2014-03-16 05:50:14 【问题描述】:

我正在尝试使用 C++ (Visual Studio 2013) 将完整网页保存到 .txt 文件中。我正在使用卷曲。 一切正常,但我试图保存的网站 - 使用大量 javascript 来生成页面。因此,当我使用 cURL 保存网页时 - .txt 文件只有约 170 行。 当我使用 Google Chrome (ctrl+s) 将网页保存到 .htm 文件时 - .htm 文件有超过 2000 行。有没有办法将完全加载的网页保存到文件中? 这是我正在使用的代码:

struct MemoryStruct 
    char *memory;
    size_t size;
;

static size_t
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)

    size_t realsize = size * nmemb;
    struct MemoryStruct *mem = (struct MemoryStruct *)userp;

    mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);
    if (mem->memory == NULL) 
        /* out of memory! */
        printf("not enough memory (realloc returned NULL)\n");
        return 0;
    

    memcpy(&(mem->memory[mem->size]), contents, realsize);
    mem->size += realsize;
    mem->memory[mem->size] = 0;

    return realsize;



int main(void)

    CURL *curl_handle;
    CURLcode res;

    struct MemoryStruct chunk;

    chunk.memory = (char*)malloc(1);  /* will be grown as needed by the realloc above */
    chunk.size = 0;    /* no data at this point */

    curl_global_init(CURL_GLOBAL_ALL);

    /* init the curl session */
    curl_handle = curl_easy_init();

    /* specify URL to get */
    curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/");

    /* send all data to this function  */
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

    /* we pass our 'chunk' struct to the callback function */
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);

    /* some servers don't like requests that are made without a user-agent
    field, so we provide one */
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    /* get it! */
    res = curl_easy_perform(curl_handle);

    /* check for errors */
    if (res != CURLE_OK) 
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
            curl_easy_strerror(res));
    
    else 
        /*
        * Now, our chunk.memory points to a memory block that is chunk.size
        * bytes big and contains the remote file.
        *
        * Do something nice with it!
        */

        printf("%lu bytes retrieved\n", (long)chunk.size);
    
    std::ofstream oplik;
    oplik.open("test.txt");
    oplik << chunk.memory;
    oplik.close();

    /* cleanup curl stuff */
    curl_easy_cleanup(curl_handle);

    if (chunk.memory)
        free(chunk.memory);

    /* we're done with libcurl, so clean it up */
    curl_global_cleanup();

    return 0;

感谢您的帮助,抱歉我的英语不好。

【问题讨论】:

【参考方案1】:

cURL 只能保存网络服务器传递的内容。

如果您想保存除此之外的任何内容,则必须像任何网络浏览器一样包含一个 javascript 解释器来构建网页。

【讨论】:

我不知道该怎么做。有没有更简单的方法,只用Internet Explorer打开网页,然后获取生成的数据? 我也不知道,因为我不熟悉Windows或IE。但我可以想象,有一些组件允许这样做。否则,您可以查看embed V8 或***.com/q/93692/1741542

以上是关于C++ cURL - 如何将完整的网页保存到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

将网页保存到服务器文件夹

将 cURL 内容结果保存到 C++ 中的字符串中

如何将一个网页以及包含的文件全部整站下载到本地电脑里?

如何删除linux curl 命令行

Mac电脑如何保存整个网页到本地?

以编程方式将网页 HTM 保存为文本文件