Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python从http服务器下载文件_Python_Automation - Fatal编程技术网

用python从http服务器下载文件

用python从http服务器下载文件,python,automation,Python,Automation,使用urllib2,我们可以从web服务器获取http响应。如果该服务器只是保存一个文件列表,我们就可以解析这些文件并分别下载它们。但是,我不确定解析文件的最简单、最具Python风格的方法是什么 当您通过urllib2的urlopen()方法获得通用文件服务器列表的整个http响应时,我们如何才能整齐地下载每个文件?您能保证您请求的URL是目录列表吗?如果是这样,您能保证目录列表的格式吗 如果是这样,您可以使用解析返回的文档并找到保存文件路径的所有元素,然后迭代这些元素并下载每个文件。以下是一

使用urllib2,我们可以从web服务器获取http响应。如果该服务器只是保存一个文件列表,我们就可以解析这些文件并分别下载它们。但是,我不确定解析文件的最简单、最具Python风格的方法是什么


当您通过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()
  • 下载索引文件

    如果它真的很大,可能值得一次读一大块; 否则,把整件事都记在记忆里可能会更容易

  • 提取要获取的文件列表

    如果列表是xml或html,请使用适当的解析器; 否则,如果有很多字符串处理要做,请使用regex; 否则使用简单的字符串方法

    同样,您可以一次性或增量地解析它。 渐进式的更高效、更优雅, 但除非你要处理数万个 当然,这可能并不重要

  • 对于每个文件,下载并保存到文件中

    如果你想加快速度,你可以试试 运行多个下载线程

    另一种(明显更快的)方法可能是 将工作委托给专用下载程序 像Aria2这样的程序- 请注意,Aria2可以作为服务运行并受控制 通过XMLRPC,请参阅


  • 我的建议是使用(这是一个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