对我来说,我有一个非常棘手的问题...我希望对于C中更有经验的程序员而言,这不是问题。我必须创建一个程序(尽可能简单)从一些网页下载所有图像。 该程序必须使用C语言(不是C ++或任何其他语言)。
我找到cURL库来下载源代码,但我不知道如何下载图像。
ETID:只需要使用.jpg,.gif和.png扩展名获取所有图像
请帮帮我。我是没有经验的程序员,所以请求明确的答案。
提前谢谢你。
答案 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的全部内容提取到缓冲区中。您可能需要保留该缓冲区的填充大小并进行扩展(使用malloc
,calloc
或realloc
)。
您可能希望首先获取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>