使用Python下载数千个文件的最快方法是什么?

9

我需要下载一千个csv文件,大小在20KB到350KB之间。目前我的代码如下:

我使用urllib.request.urlretrieve下载。所有这些文件的大小加起来是250MB,下载了一个多小时。

所以我的问题是:

如何在一个小时内更快地下载一千个csv文件?

谢谢!


你是否违反了雅虎许可协议?你有检查过吗?如果没有,他们可能会限制你的连接以防止你这样做。 - Joe
@joe 我不是从雅虎下载这个,这只是一个示例代码。 - Michael
你的文件大小和文件数量不匹配。一千个20KB的文件意味着文件大小在20到350MB之间,而不是5MB。 - Lennart Regebro
@Lennart Regebro,请检查我的编辑。 - Michael
2
你为什么删除了你问题中的代码? - martineau
4个回答

9
很可能需要花费很长时间的原因是需要打开连接、发出请求、获取文件并再次关闭连接。每小时下载一千个文件意味着每个文件需要3.6秒,这很高,但你所下载的网站可能速度较慢。
首先要做的是使用HTTP/2.0,并保持一个连接以进行所有文件的下载,使用Keep-Alive。最简单的方法是使用Requests库,并使用session
如果仍然不够快,那么你需要使用multiprocessingthreads进行多个并行下载。

OP正在使用Python3.x,而这些链接是2.x文档。 - Bleeding Fingers
你需要在服务器和客户端两端都有足够的带宽,尽管有些人认为这是不太可能的。服务器还需要支持保持连接。 - Derek Litz
@DerekLitz:速度不到0.5Mb/s。当然,服务器可能会过载或受限,但对于许多小文件来说,延迟将是一个重要因素。 - Lennart Regebro
@LennartRegebro 嗯,那是个好的假设 :) - Derek Litz

2
问题很可能不是带宽(连接速度),因为任何网络连接都可以保持该带宽。问题是延迟 - 建立连接和设置传输所需的时间。我对Python一无所知,但建议您将列表拆分并在多个线程或进程上并行运行查询 - 因为问题几乎肯定不是CPU或带宽限制。因此,我的意思是并行发出多个请求,以便一堆设置可以同时进行,并且每个请求所需的时间被隐藏在另一个请求后面。
顺便说一句,如果您的一千个文件总共为5MB,则它们每个约为5kB,而不是您所说的20kB到350kB。

1

你应该尝试使用多线程来同时下载多个文件。可以查看multiprocessing,特别是工作池。


0

如果你没有更快的互联网连接,要想达到那样的速度可能是不太可能的。除非你能够获得更快的网络连接,或者让提供者提供zip或tar.gz格式的文件。

另一种可能性是使用云服务,例如Amazon将文件传输到云端位置,然后在云端压缩文件并下载到本地机器。由于云服务位于互联网骨干网上,因此它的服务速度应该比你的快。但缺点是你可能需要根据所使用的服务付费。


3
比5MB每小时更快的互联网连接速度? :-) 我不认为这是问题。除非他实际上是在使用14.4kb调制解调器。 - Lennart Regebro

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