用python从http服务器下载文件
使用urllib2,我们可以从web服务器获取http响应。如果该服务器只是保存一个文件列表,我们就可以解析这些文件并分别下载它们。但是,我不确定解析文件的最简单、最具Python风格的方法是什么用python从http服务器下载文件,python,automation,Python,Automation,使用urllib2,我们可以从web服务器获取http响应。如果该服务器只是保存一个文件列表,我们就可以解析这些文件并分别下载它们。但是,我不确定解析文件的最简单、最具Python风格的方法是什么 当您通过urllib2的urlopen()方法获得通用文件服务器列表的整个http响应时,我们如何才能整齐地下载每个文件?您能保证您请求的URL是目录列表吗?如果是这样,您能保证目录列表的格式吗 如果是这样,您可以使用解析返回的文档并找到保存文件路径的所有元素,然后迭代这些元素并下载每个文件。以下是一
当您通过urllib2的urlopen()方法获得通用文件服务器列表的整个http响应时,我们如何才能整齐地下载每个文件?您能保证您请求的URL是目录列表吗?如果是这样,您能保证目录列表的格式吗
如果是这样,您可以使用解析返回的文档并找到保存文件路径的所有元素,然后迭代这些元素并下载每个文件。以下是一个未经测试的解决方案:
import urllib2
response = urllib2.urlopen('http://server.com/file.txt')
urls = response.read().replace('\r', '').split('\n')
for file in urls:
print 'Downloading ' + file
response = urllib2.urlopen(file)
handle = open(file, 'w')
handle.write(response.read())
handle.close()
这是未经测试的,可能不会起作用。这是假设您在另一个文件中有一个实际的文件列表。祝你好运 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()
重新导入
导入urllib2
导入pycurl
url=”http://server.domain/"
path=“path/”
模式=''%path
response=urllib2.urlopen(url+path).read()
对于re.findall(模式、响应)中的文件名:
打开(文件名为“wb”)作为fp:
curl=pycurl.curl()
setopt(pycurl.URL,URL+path+filename)
curl.setopt(pycurl.WRITEDATA,fp)
curl.perform()
curl.close()
我的建议是使用(这是一个HTML/XML解析器)来解析页面中的文件列表。那么,pycURL肯定会派上用场
获得文件列表后,另一种方法是以类似于wget的方式使用,以便将文件下载到文件系统上的某个位置。您可以使用urllib.urlretrieve(在Python 3.x中:urllib.request.urlretrieve): 这应该是工作:) 这是一个可以做同样事情的函数(使用urllib):
这是一种非常规的方式,但尽管它有效
fPointer = open(picName, 'wb')
self.curl.setopt(self.curl.WRITEFUNCTION, fPointer.write)
urllib.urlretrieve(link, picName) - correct way
您是否愿意从这个“文件列表”中为我们提供三行或四行示例源代码,以便我们了解可能涉及的额外格式?有些人还喜欢使用pyquery;)我没有做速度测试,但也可以使用
BeautifulSoup
获取所有
然后从中获取.text
。
def download(url):
webFile = urllib.urlopen(url)
localFile = open(url.split('/')[-1], 'w')
localFile.write(webFile.read())
webFile.close()
localFile.close()
fPointer = open(picName, 'wb')
self.curl.setopt(self.curl.WRITEFUNCTION, fPointer.write)
urllib.urlretrieve(link, picName) - correct way