Рубрики
Без рубрики

Загрузка файлов из URL-адресов в Python

Этот пост о том, как эффективно / правильно загрузить файлы из URL-адресов с помощью Python. Я буду использовать заявки библиотеки GOG-TRAIL для этого.

Автор оригинала: Avi Aryan.

Этот пост о том, как эффективно/правильно загрузить файлы из URL-адресов с помощью Python. Я буду использовать заявки библиотеки GOG-TRAIL для этого. Я напишу о методах, чтобы правильно загрузить двоичные файлы из URL-адресов и установить их имена файлов.

Начнем с детских шагов на том, как скачать файл, используя запросы –

import requests

url = 'http://google.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
open('google.ico', 'wb').write(r.content)

Приведенный выше код будет загружать носитель на http://google.com/favicon.ico и сохранить его как google.ico.

Теперь давайте сделаем еще один пример, где URL это https://www.youtube.com/watch?v=9bzkp7q19f0 Отказ Как вы думаете, что произойдет, если приведенный выше код используется для его загрузки? Если вы сказали, что HTML-страница будет загружена, вы обнаружены. Это была одна из проблем, с которыми я столкнулся в модуле Import Of Open Event, где мне пришлось загружать медиа из определенных ссылок. Когда URL связан с веб-страницей, а не двоичным, я должен был не загрузить этот файл и просто держать ссылку как есть. Чтобы решить это, что я сделал, был осматривать заголовки URL. Заголовки обычно содержат Content-Type Параметр, который рассказывает нам о типе данных, с помощью URL связан. Наивный способ сделать это будет –

r = requests.get(url, allow_redirects=True)
print r.headers.get('content-type')

Он работает, но не является оптимальным способом для этого, так как он включает в себя загрузку файла для проверки заголовка. Поэтому, если файл большой, это ничего не сделает, кроме пропускной способности отходов. Я посмотрел в документацию по запросу и нашел лучший способ сделать это. Таким образом, вовлеченным, просто вытесняя заголовки URL, прежде чем на самом деле загружать его. Это позволяет пропустить загрузку файлов, которые не должны были быть загружены.

import requests

def is_downloadable(url):
    """
    Does the url contain a downloadable resource
    """
    h = requests.head(url, allow_redirects=True)
    header = h.headers
    content_type = header.get('content-type')
    if 'text' in content_type.lower():
        return False
    if 'html' in content_type.lower():
        return False
    return True

print is_downloadable('https://www.youtube.com/watch?v=9bZkp7q19f0')
# >> False
print is_downloadable('http://google.com/favicon.ico')
# >> True

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

content_length = header.get('content-length', None)
if content_length and content_length > 2e8:  # 200 mb approx
  return False

Таким образом, используя вышеуказанную функцию, мы можем пропустить загрузку URL-адресов, которые не ссылаются на носитель.

Получение имени файла от URL

Мы можем анализировать URL-адрес, чтобы получить имя файла. Пример – http://avibyan.in/images/profile.png Отказ

Чтобы извлечь имя файла из вышеупомянутого URL, мы можем написать рутину, которая вытекает последнюю строку после обратной косой (/).

url = 'http://aviaryan.in/images/profile.png'
if url.find('/'):
  print url.rsplit('/', 1)[1]

Это будет правильно придать имя файла в некоторых случаях. Тем не менее, есть времена, когда информация имена файла нет в URL. Пример, что-то вроде http://url.com/download . Отказ В этом случае Контент-н-н-н-рол Заголовок будет содержать информацию имени файла. Вот как забрать это.

import requests
import re

def get_filename_from_cd(cd):
    """
    Get filename from content-disposition
    """
    if not cd:
        return None
    fname = re.findall('filename=(.+)', cd)
    if len(fname) == 0:
        return None
    return fname[0]


url = 'http://google.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
filename = get_filename_from_cd(r.headers.get('content-disposition'))
open(filename, 'wb').write(r.content)

Код URL-анализа в сочетании с вышеуказанным методом для получения имени файла от Контент-н-н-н-рол Заголовок будет работать для большинства случаев. Используйте их и проверите результаты.

Это мои 2 цента при загрузке файлов, использующих запросы в Python. Дайте мне знать о других уловках, которые я мог бы упустить из виду.

Эта статья была впервые написана на моем Персональный блог Отказ