Python ищет на удаленном файле с помощью HTTP

Как я ищу на особую позицию по удаленному (HTTP) файл, таким образом, я могу загрузить только ту часть?

Позволяет говорят, что байты на удаленном файле были: 1234567890

Я хочу искать на 4 и загрузить 3 байта оттуда, таким образом, я имел бы: 456

и также, как я проверяю, существует ли удаленный файл? Я попробовал, os.path.isfile (), но это возвращает False, когда я передаю удаленный URL файла.

11
задан TylerH 16 December 2015 в 20:41
поделиться

2 ответа

Если вы загружаете удаленный файл по HTTP, вам нужно установить заголовок Range.

Проверьте в этом примере, как это можно сделать. Похоже на то:

myUrlclass.addheader("Range","bytes=%s-" % (existSize))

EDIT: Я только что нашел лучшую реализацию. Этот класс очень прост в использовании, как видно из документации.

class HTTPRangeHandler(urllib2.BaseHandler):
"""Handler that enables HTTP Range headers.

This was extremely simple. The Range header is a HTTP feature to
begin with so all this class does is tell urllib2 that the 
"206 Partial Content" reponse from the HTTP server is what we 
expected.

Example:
    import urllib2
    import byterange

    range_handler = range.HTTPRangeHandler()
    opener = urllib2.build_opener(range_handler)

    # install it
    urllib2.install_opener(opener)

    # create Request and set Range header
    req = urllib2.Request('http://www.python.org/')
    req.header['Range'] = 'bytes=30-50'
    f = urllib2.urlopen(req)
"""

def http_error_206(self, req, fp, code, msg, hdrs):
    # 206 Partial Content Response
    r = urllib.addinfourl(fp, hdrs, req.get_full_url())
    r.code = code
    r.msg = msg
    return r

def http_error_416(self, req, fp, code, msg, hdrs):
    # HTTP's Range Not Satisfiable error
    raise RangeError('Requested Range Not Satisfiable')

Update: Лучшая реализация" переместилась в github: excid3/urlgrabber в файле byterange.py.

.
16
ответ дан 3 December 2019 в 03:52
поделиться

AFAIK, это невозможно с помощью fseek() или подобного рода. Для этого необходимо использовать заголовок диапазона HTTP Range. Этот заголовок может поддерживаться или не поддерживаться сервером, поэтому ваш пробег может отличаться.

import urllib2

myHeaders = {'Range':'bytes=0-9'}

req = urllib2.Request('http://www.promotionalpromos.com/mirrors/gnu/gnu/bash/bash-1.14.3-1.14.4.diff.gz',headers=myHeaders)

partialFile = urllib2.urlopen(req)

s2 = (partialFile.read())

EDIT: Это, конечно, предполагает, что под удаленным файлом вы подразумеваете файл, хранящийся на HTTP-сервере...

Если файл, который вам нужен, находится на FTP-сервере, FTP позволяет указать только смещение start, а не диапазон. Если это то, что вы хотите, то следующий код должен сделать это (не тестировался!)

import ftplib
fileToRetrieve = 'somefile.zip'
fromByte = 15
ftp = ftplib.FTP('ftp.someplace.net')
outFile = open('partialFile', 'wb')
ftp.retrbinary('RETR '+ fileToRetrieve, outFile.write, rest=str(fromByte))
outFile.close()
4
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: