Python urllib.urlretrieve()与wget的区别

12 投票
2 回答
9682 浏览
提问于 2025-04-15 22:24

我正在用Python下载一个500MB的文件,我有一个脚本使用了urllib.urlretrieve()这个方法。但是我发现我和下载网站之间似乎有一些网络问题,这个方法总是卡住,无法完成下载。不过,使用wget来下载这个文件通常没有问题。请问urlretrieve()wget之间有什么区别,导致了这种情况?

2 个回答

2

如果你正在使用:

page = urllib.retrieve('http://example.com/really_big_file.html')

那么你会创建一个500MB的字符串,这可能会让你的电脑负担很重,变得很慢,甚至导致连接超时。如果是这样的话,你应该使用:

(filename, headers) = urllib.retrieve('http://...', 'local_outputfile.html')

这样就不会给解释器带来压力。

值得注意的是,urllib.retrieve() 使用了 urllib.urlopen(),这个方法现在已经不推荐使用了

17

这个问题的答案其实很简单。Python的 urlliburllib2 还没有发展得足够成熟和强大。根据我的经验,比wget更好的工具是 cURL。我写过代码,可以通过HTTP下载几GB的文件,文件大小从50 KB到超过2 GB都有。就我所知,cURL 是目前这个任务中最可靠的软件。我觉得Python、wget,甚至大多数网页浏览器在正确性和稳定性上都无法与它相比。在现代的Python环境中,使用urllib2以正确的方式操作,虽然可以做到相对可靠,但我还是会运行一个cURL的子进程,这样绝对稳妥。

换句话说,cURL只专注于一件事情,而且做得比其他软件都好,因为它经过了更多的开发和优化。Python的 urllib2 还算好用,方便,对于小到中等的工作量也能应付,但在可靠性方面,cURL远远领先。

另外,cURL有很多选项可以调整其可靠性表现,比如重试次数、超时设置等等。

撰写回答