使用C#下载3000多张图片?

5
我有一个约3000个图像URL的列表,我需要将它们下载到我的桌面上。我是一名web开发者,所以自然而然地写了一个小的asp.net c#下载方法来执行这个任务但是很明显的问题发生了,页面在我几乎没有下载完所有图片之前就超时了。
想知道是否有其他人知道一种好的、快捷的和强大的方式让我循环遍历所有的图像URL并将它们下载到一个文件夹?我可以接受任何建议,例如WinForms、批处理文件,尽管我对两者都很陌生。非常感谢您的任何帮助。
6个回答

11

编写一个 C# 命令行应用程序(或 Winforms,如果你更倾向于此),并使用 WebClient 类来获取文件。

以下是一些教程:

C# WebClient 教程

使用 WebClient 下载文件

或者,只需搜索 C# WebClient

你需要提供一个要下载的文件列表,并遍历该列表,为每个文件发出请求并保存结果,或者发出索引页面的请求,使用类似于HTML Agility Pack 的工具解析它以查找所有图像标记,然后为每个图像发出请求,并将结果保存在本地驱动器某处。

编辑

如果你只想这样做一次(又如,不作为应用程序的一部分),那么mbeckish 的回答最有意义。


7
最简单的方法是使用Parallel.ForEach()来加快下载速度。 - roufamatic
Parallel.ForEach() 真不错 - 我以前没见过。 - 3Dave
我也从未听说过那个,我将去查看它以备将来参考 :) 谢谢 - YodasMyDad

11

那么wget呢?它可以下载一个文件中指定的URL列表。

wget -i c:\list-of-urls.txt

太棒了,谢谢!我之前用过这个来获取网页。 - YodasMyDad
3
这可能不会影响到你,但请注意旧版本的 wget 下载大小超过 2(或者可能是 4)GB 后会出现问题。链接的版本几乎肯定会遇到这个问题。http://users.ugent.be/~bpuype/wget/ 是更新的版本。 - spender
@spender:已更新指向 GnuWin32 项目的链接:http://gnuwin32.sourceforge.net/packages/wget.htm - Richard
我在Windows上使用了wget64。效果很好。 - Corgalore

8
你可能想使用像Orbit这样的现有下载管理器,而不是为此编写自己的程序。(亵渎,我知道)
我一直很满意Orbit。它可以从文本文件导入下载列表。它会管理连接,在多个连接并行下载每个文件的部分,以增加每个下载的速度。如果连接超时等情况,它会负责重试。如果你想从头开始构建这些功能,似乎需要付出很多努力。

1
但这样有什么乐趣呢?+1 - 3Dave
我知道,我是个扫兴的人。 :-) - StriplingWarrior
请确保在安装程序中取消所有广告软件选项。 - StriplingWarrior

6
如果这只是一次性的工作,那么一个简单的解决方案就是编写一个HTML页面,其中包含指向URL的img标签。然后使用FireFox浏览器并使用扩展程序将所有图像保存到文件夹中。

好主意,谢谢 :) 我会尝试使用wget,并将其作为备份。 - YodasMyDad

1

在假设这是一个一次性的项目,并且您是其他技术的新手的情况下,我建议如下:

与其尝试在一个Web请求中下载所有3000个图像,不如每次请求一个图像。当图像下载完成后,重定向到相同的页面,将要获取的下一个图像的URL作为查询字符串参数传递。下载该文件,然后重复此过程,直到下载完所有图像。

这不是我所说的“生产”解决方案,但如果我的假设是正确的,这是一个可以让您快速上手的解决方案。

另一个相当简单的解决方案是创建一个简单的C#控制台应用程序,使用WebClient下载每个图像。以下伪代码应该足以让您开始:

List<string> imageUrls = new List<string>();
imageUrls.Add(..... your urls from wherever .....)

foreach(string imageUrl in imagesUrls)
{
    using (WebClient client = new WebClient())
    {
        byte[] raw = client.DownloadData(imageUrl);

        .. write raw .. to file
    }
}

你最好使用 Parallel.ForEach() 循环遍历那些 imagesUrls。 - Pauli Østerø

0

我曾经在WinForms中编写过类似的应用程序,它可以循环遍历Excel电子表格中的URL并下载图像文件。我认为你在将其实现为Web应用程序时遇到的问题是服务器只允许该进程运行一小段时间,然后就会超时。你可以在web.config文件中增加这个时间(更改httpRuntime元素的executionTimeout属性),或者将此功能实现为WinForms应用程序,这样长时间执行不会成为问题。如果这不仅仅是一个临时应用程序,并且你决定采用WinForms路线,你可能需要添加一个进度条来显示下载进度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接