Загрузка файлов с http-сервера в python - PullRequest
4 голосов
/ 04 января 2011

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

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

Ответы [ 7 ]

9 голосов
/ 04 января 2011

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()
6 голосов
/ 24 августа 2012

Вы можете использовать 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()
3 голосов
/ 04 января 2011

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

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

2 голосов
/ 21 августа 2013

Это не совсем обычный способ, но хотя он работает

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


urllib.urlretrieve(link, picName) - correct way
2 голосов
/ 04 января 2011

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

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

2 голосов
/ 04 января 2011
  1. Загрузить индексный файл

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

  2. Извлечь список файлов, чтобы получить

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

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

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

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

    другой (значительно более быстрый) подход может заключаться в делегировании работы специальной программе-загрузчику, такой как Aria2 * 1021.*http://aria2.sourceforge.net/ - обратите внимание, что Aria2 может работать как служба и управляться через XMLRPC, см. http://sourceforge.net/apps/trac/aria2/wiki/XmlrpcInterface#InteractWitharia2UsingPython

2 голосов
/ 04 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...