在Python中从HTTP服务器下载文件

5 投票
7 回答
45797 浏览
提问于 2025-04-16 09:22

使用urllib2,我们可以从网络服务器获取HTTP响应。如果这个服务器只是存放了一些文件的列表,我们可以逐个查看这些文件并下载它们。不过,我不太确定用什么样的方法来解析这些文件是最简单、最符合Python风格的。

当你通过urllib2的urlopen()方法获取到一个包含文件列表的HTTP响应时,我们该如何整齐地下载每个文件呢?

7 个回答

3

你能保证你请求的这个网址是一个目录列表吗?如果可以的话,你能保证这个目录列表的格式吗?

如果可以的话,你可以使用lxml这个工具来解析返回的文档,找到所有包含文件路径的元素,然后逐个处理这些元素,下载每个文件。

9

你可以使用 urllib.urlretrieve(在 Python 3.x 中是 urllib.request.urlretrieve):

import urllib
urllib.urlretrieve('http://site.com/', filename='filez.txt')

这样应该可以正常工作 :)

还有一个函数也可以实现同样的功能(使用 urllib):

def download(url):
    webFile = urllib.urlopen(url)
    localFile = open(url.split('/')[-1], 'w')
    localFile.write(webFile.read())
    webFile.close()
    localFile.close()
12

使用Urllib2可以获取文件列表,这个方法还不错。不过如果你需要下载很多大的二进制文件,PycURL会是更好的选择。这个方法在我用的IIS文件服务器上效果很好:

import re
import urllib2
import pycurl

url = "http://server.domain/"
path = "path/"
pattern = '<A HREF="/%s.*?">(.*?)</A>' % path

response = urllib2.urlopen(url+path).read()

for filename in re.findall(pattern, response):
    with open(filename, "wb") as fp:
        curl = pycurl.Curl()
        curl.setopt(pycurl.URL, url+path+filename)
        curl.setopt(pycurl.WRITEDATA, fp)
        curl.perform()
        curl.close()

撰写回答