【问题标题】:Downloading files from an http server in python在 python 中从 http 服务器下载文件
【发布时间】:2011-06-03 02:52:17
【问题描述】:

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

当你得到一个完整的通用文件服务器列表的http响应,通过urllib2的urlopen()方法,我们如何才能整齐的下载每个文件呢?

【问题讨论】:

  • 您是否愿意从这个“文件列表”中给我们提供三四行示例源代码,以便我们了解可能涉及哪些额外的格式?

标签: python automation


【解决方案1】:

Urllib2 可能可以检索文件列表。对于下载大量二进制文件,PycURL http://pycurl.sourceforge.net/ 是更好的选择。这适用于我的基于 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()

【讨论】:

  • 我没有做速度测试,但也可以使用BeautifulSoup从他们那里得到所有&lt;a&gt;s然后.text
【解决方案2】:

这是一种非常规的方式,但虽然有效

fPointer = open(picName, 'wb')
self.curl.setopt(self.curl.WRITEFUNCTION, fPointer.write) 


urllib.urlretrieve(link, picName) - correct way

【讨论】:

    【解决方案3】:

    您可以使用 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()
    

    【讨论】:

      【解决方案4】:

      我的建议是使用BeautifulSoup(它是一个 HTML/XML 解析器)来解析页面以获取文件列表。那么,pycURL 肯定会派上用场。

      获得文件列表后,另一种方法是使用urllib.urlretrieve 以类似于 wget 的方式将文件下载到文件系统上的某个位置。

      【讨论】:

        【解决方案5】:
        1. 下载索引文件

          如果它真的很大,可能值得一次阅读一大块; 否则可能更容易将整个内容抓取到内存中。

        2. 提取要获取的文件列表

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

          同样,您可以一次性或增量解析它。 Incrementally 更加高效和优雅, 但除非你正在处理数以万计 行数可能并不重要。

        3. 对于每个文件,下载并保存到文件中。

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

          另一种(明显更快)的方法可能是 将工作委托给专门的下载者 像 Aria2 http://aria2.sourceforge.net/ 这样的程序 - 请注意,Aria2 可以作为服务运行并受控 通过 XMLRPC,见http://sourceforge.net/apps/trac/aria2/wiki/XmlrpcInterface#InteractWitharia2UsingPython

        【讨论】:

          【解决方案6】:

          这是一个未经测试的解决方案:

          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()
          

          它未经测试,可能无法正常工作。这是假设您在另一个文件中有一个实际的 list 文件。祝你好运!

          【讨论】:

            【解决方案7】:

            您能保证您请求的 URL 是目录列表吗?如果可以,能否保证目录列表的格式?

            如果是这样,您可以使用lxml 解析返回的文档并找到包含文件路径的所有元素,然后遍历这些元素并下载每个文件。

            【讨论】:

            • 还有一些人还喜欢使用 pyquery ;)
            猜你喜欢
            • 1970-01-01
            • 2012-07-30
            • 2013-09-23
            • 2022-06-18
            • 2022-11-21
            • 2021-09-28
            相关资源
            最近更新 更多