Загрузка файлов с http-сервера в python

Используя urllib2, мы можем получить ответ HTTP с веб-сервера. Если этот сервер просто содержит список файлов, мы можем разбирать файлы и загружать их по отдельности. Тем не менее, я не уверен, что самый простой, самый pythonic способ проанализировать файлы.

Когда вы получаете полный ответ HTTP из списка общих файловых серверов, используя метод urlopib () urllib2, как мы можем аккуратно загрузить каждый файл?

7 Solutions collect form web for “Загрузка файлов с http-сервера в python”

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): fp = open(filename, "wb") curl = pycurl.Curl() curl.setopt(pycurl.URL, url+path+filename) curl.setopt(pycurl.WRITEDATA, fp) curl.perform() curl.close() fp.close() 

Вы можете использовать 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() 

Можете ли вы гарантировать, что запрашиваемый URL-адрес – это список каталогов? Если да, можете ли вы гарантировать формат списка каталогов?

Если это так, вы можете использовать lxml для анализа возвращаемого документа и поиска всех элементов, которые содержат путь к файлу, а затем перебирать эти элементы и загружать каждый файл.

Вот непроверенное решение:

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

Это непроверено, и, вероятно, это не сработает. Предполагается, что у вас есть фактический список файлов внутри другого файла. Удачи!

  1. Загрузите индексный файл

    Если это действительно огромно, возможно, стоит прочитать кусок за раз; в противном случае, вероятно, проще просто захватить все это в память.

  2. Извлеките список файлов для получения

    Если в списке есть xml или html, используйте соответствующий синтаксический анализатор; else, если требуется много строковой обработки, используйте regex; иначе используйте простые строковые методы.

    Опять же, вы можете разобрать его все-на-один или постепенно. Постепенно несколько более эффективно и элегантно, но если вы не обрабатываете несколько десятков тысяч строк, это, вероятно, не критично.

  3. Для каждого файла загрузите его и сохраните в файл.

    Если вы хотите попытаться ускорить работу, попробуйте запустить несколько потоков загрузки;

    другой (значительно более быстрый) подход может состоять в том, чтобы делегировать работу в выделенную программу загрузчика, такую ​​как Aria2 http://aria2.sourceforge.net/, – отметить, что Aria2 можно запускать как службу и управлять через XMLRPC, см. http: // sourceforge .net / приложения / ПРОФ / aria2 / вики / XmlrpcInterface # InteractWitharia2UsingPython

Мое предложение было бы использовать BeautifulSoup (который является парсером HTML / XML), чтобы проанализировать страницу для списка файлов. Тогда pycURL определенно пригодится.

Еще один способ, когда у вас есть список файлов, – использовать urllib.urlretrieve таким же образом, как wget, чтобы просто загрузить файл в папку на вашей файловой системе.

Это недопустимый способ, но хотя он работает

 fPointer = open(picName, 'wb') self.curl.setopt(self.curl.WRITEFUNCTION, fPointer.write) urllib.urlretrieve(link, picName) - correct way 
Python - лучший язык программирования в мире.