如何从C网页下载所有图像?

时间:2014-06-11 12:08:30

标签: c curl libcurl

对我来说,我有一个非常棘手的问题...我希望对于C中更有经验的程序员而言,这不是问题。我必须创建一个程序(尽可能简单)从一些网页下载所有图像。 该程序必须使用C语言(不是C ++或任何其他语言)。

我找到cURL库来下载源代码,但我不知道如何下载图像。

ETID:只需要使用.jpg,.gif和.png扩展名获取所有图像

请帮帮我。我是没有经验的程序员,所以请求明确的答案。

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

你可以这样做

#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string>

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

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    char *url = "http://localhost/image.jpeg";
    char outfilename[] = "saveimage.jpeg";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename,"wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

您可以尝试使用wget下载所有图片。

#include <stdio.h>

int main()
{

     char command[] = "wget -A png,jpeg,jpg,gif -r http://www.freeimages.com/";  
     system(command); 
     return 0;
}

答案 1 :(得分:0)

您可以将libcurl用于文本内容(例如mime类型text/html)和图像(例如mime类型image/jpeg)。阅读libcurl tutorial。您可能还想研究wget

的源代码

您可能需要将某些URL的全部内容提取到缓冲区中。您可能需要保留该缓冲区的填充大小并进行扩展(使用malloccallocrealloc)。

您可能希望首先获取HTML页面,然后以某种方式解析其HTML内容并查找<img标记。 (您可以开始使用strstr重复查找<img字符串;您还可以使用snprintf来构建一些字符串)。然后,解析他们的src=属性,并尝试从中计算URL。

这样的东西
 const char* pagecontent;
 /// retrieve a page content using CURL,
 /// check that its mime type is text/html,
 char* imgtag = NULL;
 for (imgtag = strstr(pagecontent, "<img ");
      imgtag != NULL;
      imgtag = strstr(imgtag+4, "<img "))
   {
     char* srcattr = strstr(imgtag, "src=");
     if (srcattr) {
         /// parse the src just after srcattr+4
         /// build an URL for the image using snprintf
         /// retreive that image using libcurl

显然,你需要了解一点HTML

实际上,查找<img>标签并非防故障。有些网站主要是AJAX,可以使用AJAX请求获取图像。

(实际上我相信,由于AJAX或嵌入式Javascript发现所有图像不可判断,并且可能被证明等同于halting problem )功能

如果您是C语言中的新手,请不要忘记编译所有警告和调试信息(例如gcc -Wall -Wextra -g ....)并学习如何使用调试器(例如gdb)< / p>