Как скачивать изображения с помощью библиотеки requests в Python?
Я установил библиотеку requests в Python 3.6. Необходимо скачать изображения по предоставленной ссылке на файл. Подскажите, пожалуйста, как это можно реализовать? Доступ к изображению я получаю следующим образом: img = r.get(‘URL here’)
Отслеживать
задан 8 мар 2017 в 12:34
77 1 1 золотой знак 3 3 серебряных знака 6 6 бронзовых знаков
Связанный вопрос: How to download image using requests
8 мар 2017 в 12:56
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В респонсе будет атрибут content в котором содержится изображение в двоичном виде. Таким образом после получения ответа необходимо будет сохранить в его файл.
img = r.get("img_url") img_file = file('path_to_image', 'w') img_file.write(img.content) img_file.close()
Отслеживать
ответ дан 13 мар 2017 в 3:03
Ivan Panov Ivan Panov
173 1 1 серебряный знак 6 6 бронзовых знаков
во второй строчке нужно исправить по моему img_file = open(‘path_to_image’, ‘wb’)
20 дек 2019 в 18:11
- python
- requests
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Четыре метода загрузки изображений с веб-сайта с помощью Python
Недавно пришлось по работе написать простенький парсер на питоне, который бы скачивал с сайта изображения (по идее тот же самый парсер может качать не только изображения, но и файлы других форматов) и сохранял их на диске. Всего я нашел в интернете четыре метода. В этой статье я их решил собрать все вместе.
1-ый метод
Первый метод использует модуль urllib (или же urllib2). Пусть имеется ссылка на некое изображение img. Метод выглядит следующим образом:
import urllib resource = urllib.urlopen(img) out = open(". \img.jpg", 'wb') out.write(resource.read()) out.close()
Здесь нужно обратить внимание, что режим записи для изображений — ‘wb’ (бинарный), а не просто ‘w’.
2-ой метод
Второй метод использует тот же самый urllib. В дальнейшем будет показано, что этот метод чуть медленнее первого (отрицательный оттенок фактора скорости парсинга неоднозначен), но достоин внимания из-за своей краткости:
import urllib urllib.urlretrieve(img, ". \img.jpg")
Притом стоит заметить, что функция urlretrieve в библиотеке urllib2 по неизвестным мне причинам (может кто подскажет по каким) отсутствует.
3-ий метод
Третий метод использует модуль requests. Метод имеет одинаковый порядок скорости выгрузки картинок с первыми двумя методами:
import requests p = requests.get(img) out = open(". \img.jpg", "wb") out.write(p.content) out.close()
При этом при работе с веб в питоне рекомендуется использовать именно requests вместо семейств urllib и httplib из-за его краткости и удобства обращения с ним.
4-ый метод
Четвертый метод по скорости кардинально отличается от предыдущих методов (на целый порядок). Основан на использовании модуля httplib2. Выглядит следующим образом:
import httplib2 h = httplib2.Http('.cache') response, content = h.request(img) out = open('. \img.jpg', 'wb') out.write(content) out.close()
Здесь явно используется кэширование. Без кэширования (h = httplib2.Http()) метод работает в 6-9 раза медленнее предыдущих аналогов.
Тестирование скорости проводилось на примере скачивания картинок с расширением *.jpg c сайта новостной ленты lenta.ru. Выбор картинок, подпадающих под этот критерий и измерение времени выполнения программы производились следующим образом:
import re, time, urllib2 url = "http://lenta.ru/" content = urllib2.urlopen(url).read() imgUrls = re.findall('img .*?src="https://habr.com/ru/articles/210238/(.*?)"', сontent) start = time.time() for img in imgUrls: if img.endswith(".jpg"): """реализация метода по загрузке изображения из url""" print time.time()-start
Постоянно меняющиеся картинки на сайте не повлияли на чистоту измерений, поскольку методы отрабатывали друг за другом. Полученные результаты таковы:
| Метод 1, с | Метод 2, с | Метод 3, с | Метод 4, с (без кэширования, с) |
|---|---|---|---|
| 0.823 | 0.908 | 0.874 | 0.089 (7.625) |
Данные представлены как результат усреднения результатов семи измерений.
Просьба к тем, кто имел дело с библиотекой Grab (и с другими), написать в комментариях аналогичный метод по скачиванию изображений с помощью этой и других библиотек.
- питон и парсинг
- изображения
Как, используя Python, загрузить все изображения с веб-страницы

Наверняка, хоть раз в жизни вам хотелось загрузить все изображения с понравившейся веб‑страницы? Сейчас вы узнаете, как создать парсер Python, который извлекает все изображения с веб‑страницы по ее URL‑адресу и загружает их с помощью библиотек requests и BeautifulSoup .
Для начала нам понадобится довольно много зависимостей, давайте установим их:
pip3 install requests bs4 tqdm
Откройте новый файл с именем download_images.py и импортируйте необходимые модули:
import requests import os from tqdm import tqdm from bs4 import BeautifulSoup as bs from urllib.parse import urljoin, urlparse
Первое, что мы сделаем, создадим валидатор URL‑адреса, который проверяет, является ли переданный URL‑адрес действительным, поскольку есть некоторые веб‑сайты, которые помещают закодированные данные вместо URL‑адреса, поэтому нам нужно пропустить их:
def is_valid(url): """ Проверяет, является ли url допустимым URL """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme)
Функция urlparse() разбирает URL‑адрес на шесть составных частей, а нам просто нужно увидеть, есть ли там netloc (имя домена) и scheme (протокол).
Во-вторых, я собираюсь написать основную функцию, которая определет все URL‑адреса изображений на веб‑странице:
def get_all_images(url): """ Возвращает все URL‑адреса изображений по одному `url` """ soup = bs(requests.get(url).content, "html.parser")
HTML-содержимое веб‑страницы находится в объекте soup , чтобы извлечь все теги img в HTML, нам нужно использовать метод soup.find_all(«img») . Посмотрим на него в действии:
urls = [] for img in tqdm(soup.find_all("img"), "Extracting images"): img_url = img.attrs.get("src") if not img_url: # если img не содержит атрибута src, просто пропустите continue
Это получит все элементы img в виде списка Python.
Я обернул его в объект tqdm , чтобы напечатать индикатор выполнения. Чтобы получить URL‑адрес тега img , есть атрибут src . Однако есть некоторые теги, которые не содержат атрибута src , мы пропускаем, используя оператор continue .
Теперь нам нужно убедиться, что URL‑адрес является абсолютным:
# сделать URL абсолютным, присоединив домен к только что извлеченному URL img_url = urljoin(url, img_url)
Встречаются URL‑адреса, содержащие пары ключ-значение метода GET HTTP‑протокола, которые нам не нравятся (заканчиваются чем-то вроде этого «/image.png?c=3.2.5«), удалим их:
try: pos = img_url.index("?") img_url = img_url[:pos] except ValueError: pass
Получаем позицию символа « ? «, а затем после него всё удаляем, а если его нет, то возникает исключение ValueError , поэтому я заключил его в блок try/except (конечно, вы можете реализовать сей момент лучше, поделитесь своим решением в комментарии).
Теперь давайте убедимся, что каждый URL‑адрес действителен и возвращает все URL‑адреса изображений:
# наконец, если URL действителен if is_valid(img_url): urls.append(img_url) return urls
Теперь, когда у нас есть функция, которая получает все URL‑адреса изображений, нам нужна функция для загрузки файлов из Интернета , я использовал следующую функцию:
def download(url, pathname): """ Загружает файл по URL‑адресу и помещает его в папку `pathname` """ # если путь не существует, сделать этот путь dir if not os.path.isdir(pathname): os.makedirs(pathname) # загружаем тело ответа по частям, а не сразу response = requests.get(url, stream=True) # get the total file size file_size = int(response.headers.get("Content-Length", 0)) # получаем имя файла filename = os.path.join(pathname, url.split("/")[-1]) # индикатор выполнения, изменение единицы измерения на байты вместо итераций (по умолчанию tqdm) progress = tqdm(response.iter_content(1024), f"Downloading ", total=file_size, unit="B", unit_scale=True, unit_divisor=1024) with open(filename, "wb") as f: for data in progress.iterable: # записываем прочитанные данные, в файл f.write(data) # обновить вручную индикатор выполнения progress.update(len(data))
Вышеупомянутая функция принимает URL‑адрес файла для загрузки и путь к папке, в которую этот файл будет сохранен.
Наконец, вот основная функция:
def main(url, path): # получить все изображения imgs = get_all_images(url) for img in imgs: # для каждого изображения, загрузите его download(img, path)
Посмотрите код файла download_images.py целиком:
import requests import os from tqdm import tqdm from bs4 import BeautifulSoup as bs from urllib.parse import urljoin, urlparse def is_valid(url): """ Проверяем, является ли url действительным URL """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme) def get_all_images(url): """ Возвращает все URL‑адреса изображений по одному `url` """ soup = bs(requests.get(url).content, "html.parser") urls = [] for img in tqdm(soup.find_all("img"), "Получено изображение"): img_url = img.attrs.get("src") if not img_url: # если img не содержит атрибута src, просто пропускаем continue # сделаем URL абсолютным, присоединив имя домена к только что извлеченному URL img_url = urljoin(url, img_url) # удалим URL‑адреса типа '/hsts-pixel.gif?c=3.2.5' try: pos = img_url.index("?") img_url = img_url[:pos] except ValueError: pass # наконец, если URL действителен if is_valid(img_url): urls.append(img_url) return urls def download(url, pathname): """ Загружает файл по URL‑адресу и помещает его в папку `pathname` """ # если путь не существует, создать dir if not os.path.isdir(pathname): os.makedirs(pathname) # загружаем тело ответа по частям, а не сразу response = requests.get(url, stream=True) # получить общий размер файла file_size = int(response.headers.get("Content-Length", 0)) # получаем имя файла filename = os.path.join(pathname, url.split("/")[-1]) # индикатор выполнения, изменение единицы измерения на байты вместо итераций (по умолчанию tqdm) progress = tqdm(response.iter_content(1024), f"Загружен ", total=file_size, unit="B", unit_scale=True, unit_divisor=1024) with open(filename, "wb") as f: for data in progress.iterable: # записываем прочитанные данные в файл f.write(data) # обновление индикатора выполнения вручную progress.update(len(data)) def main(url, path): # получить все изображения imgs = get_all_images(url) for img in imgs: # скачать для каждого img download(img, path) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Этот скрипт загружает все изображения с веб‑страницы.") parser.add_argument("url", help="URL‑адрес веб‑страницы, с которой вы хотите загрузить изображения.") parser.add_argument("-p", "--path", help="Каталог, в котором вы хотите хранить изображения, по умолчанию - это домен переданного URL.") args = parser.parse_args() url = args.url path = args.path if not path: # если путь не указан, используйте доменное имя этого url в качестве имени папки path = urlparse(url).netloc main(url, path)
Получение всех URL‑адресов изображений с этой страницы и загрузка каждого из них по одному. Давайте проверим:
main("https://waksoft.susu.ru/", "waksoft-susu-ru")
Будут загружены все изображения с указанного URL‑адреса и сохранены в папке «waksoft‑susu‑ru», которая будет создана автоматически.
Однако обратите внимание, что есть некоторые веб‑сайты, которые загружают свои данные с помощью Javascript, в этом случае вы должны вместо этого использовать библиотеку requests_html. Я уже сделал другой скрипт, который вносит некоторые изменения в исходный и обрабатывает рендеринг Javascript, и записал его в файл download_images_js.py, посмотрите:
from requests_html import HTMLSession import requests from tqdm import tqdm from bs4 import BeautifulSoup as bs from urllib.parse import urljoin, urlparse import os def is_valid(url): """ Проверяем, является ли url действительным URL """ parsed = urlparse(url) return bool(parsed.netloc) and bool(parsed.scheme) def get_all_images(url): """ Возвращает все URL‑адреса изображений по одному `url` """ # инициализировать сеанс session = HTMLSession() # делаем HTTP‑запрос и получаем ответ response = session.get(url) # выполнить Javascript с таймаутом 20 секунд response.html.render(timeout=20) # создаем парсер soup soup = bs(response.html.html, "html.parser") urls = [] for img in tqdm(soup.find_all("img"), "Извлечено изображение"): img_url = img.attrs.get("src") or img.attrs.get("data-src") or img.attrs.get("data-original") print(img_url) if not img_url: # если img не содержит атрибута src, просто пропустим continue # сделаем URL абсолютным, присоединив имя домена к только что извлеченному URL img_url = urljoin(url, img_url) # удалим URL‑адреса типа '/hsts-pixel.gif?c=3.2.5' try: pos = img_url.index("?") img_url = img_url[:pos] except ValueError: pass # наконец, если URL действителен if is_valid(img_url): urls.append(img_url) # закрыть сеанс, чтобы завершить процесс браузера session.close() return urls def download(url, pathname): """ Загружает файл по URL‑адресу и помещает его в папку `pathname` """ # если папка не существует, создадим папку с именем dir if not os.path.isdir(pathname): os.makedirs(pathname) # загружаем тело ответа по частям, а не сразу response = requests.get(url, stream=True) # получить общий размер файла file_size = int(response.headers.get("Content-Length", 0)) # получаем имя файла filename = os.path.join(pathname, url.split("/")[-1]) # индикатор выполнения, изменяем единицы измерения на байты вместо итераций (по умолчанию tqdm) progress = tqdm(response.iter_content(1024), f"Downloading ", total=file_size, unit="B", unit_scale=True, unit_divisor=1024) with open(filename, "wb") as f: for data in progress.iterable: # записываем прочитанные данные в файл f.write(data) # обновим индикатор выполнения вручную progress.update(len(data)) def main(url, path): # получить все изображения imgs = get_all_images(url) for img in imgs: # скачать для каждого img download(img, path) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Этот скрипт загружает все изображения с веб‑страницы.") parser.add_argument("url", help="URL‑адрес веб‑страницы, с которой вы хотите загрузить изображения.") parser.add_argument("-p", "--path", help="Каталог, в котором вы хотите хранить изображения, по умолчанию - это домен переданного URL") args = parser.parse_args() url = args.url path = args.path if not path: # если путь не указан, в качестве имени папки используйте доменное имя rl path = urlparse(url).netloc main(url, path)
Хорошо, всё на сегодя!

Как, используя Python, загрузить все изображения с веб-страницы , опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Ограничение ответственности
Информация на сайте предоставляется «как есть», без всяких гарантий, включая гарантию применимости в определенных целях, коммерческой пригодности и т.п. В текстах могут быть технические неточности и ошибки. Автор не может гарантировать полноты, достоверности и актуальности всей информации, не несет ответственности за последствия использования сайта третьими лицами. Автор не делает никаких заявлений, не дает никаких гарантий и оценок относительно того, что результаты, размещенные на сайте и описанные в заявлениях относительно будущих результатов, будут достигнуты. Автор не несет ответственности за убытки, возникшие у пользователей или третьих лиц в результате использования ими сайта, включая упущенную выгоду. Автор не несет ответственности за убытки, возникшие в результате действий пользователей, явно не соответствующих обычным правилам работы с информацией в сети Интернет. Пользуясь сайтом, вы принимаете и соглашаетесь со всеми нашими правилами, включая «Ограничение ответственности».
Рекомендую
Link’s QR code
Время, где сейчас
До восхода не будить и при пожаре выносить в первую очередь, а после заката звонить только в экстренных случаях:
Скоро, скоро Новый год
Рубрики
Отче наш
Отче наш, Иже еси́ на небесе́х! Да святи́тся имя Твое́, да прии́дет Ца́рствие Твое, да будет воля Твоя, я́ко на небеси́ и на земли́. Хлеб наш насу́щный даждь нам днесь; и оста́ви нам до́лги наша, я́коже и мы оставля́ем должнико́м нашим; и не введи́ нас во искушение, но изба́ви нас от лука́ваго
Под контролем
- Академия студенчества
- ИЛИМК
- Офис академического письма
- МАЛиМК
- НОЦ Лингво-инновационных технологий
- Партнерская сеть «Институт Пушкина»
- Центр делового образования
- Центр «Лингва»
- Управление инновациями и инвестициями
- Финансовый менеджмент
- Кафедра ИТЭ
- Кафедра ЦЭИИТ
- Бизнес-информатика + Кванториум
- ВКР: Бизнес-информатика
- Бизнес-информатика on-line
- Бизнес-информатика — драйв цифровой трансформации
- ЭУ-160
- ЭУ-235
- ЭУ-320
- ЭУ-442
- ЭУ-419 (архив)
- ЭУ-444, 461 (архив)
- ЭУ-459 (архив)
- ЭУ-434 (архив)
- Магистры Бизнес-информатики
- Магистратура ВШЭУ
- Технологическая площадка
- Digital Experience Workshop
- Cтэк технологий Web-разработки: шаг за шагом
- Абитуриент ВШЭУ — 2018
- Школа бизнеса ВШЭУ
- Кибер-студент
- Зеркало сайта
- ИТ-марафон
- Покори свой Олимп
- Digital Experience
- ООО «ЮЖУРАЛСЕРВИС»
- Школа перспективных технологий
- Бизнес‑информатике 15 лет
Как скачать картинки с сайта с помощью Python
И далее сгенерированный список ссылок надо сохранить как html и скачать их любым менеджером загрузок.
import os # importing all we need, it's not much import wget urls_to_load = list() # a list to store the urls path = 'download_folder' # the path where we will download those files a = "https://member.etn-net.org/magazines/en/2001/ETN-TF_4-2001_EN/ETN-TF_4-2001_EN_01.jpg" # the first two images are separate as the source has them named differently b = "https://member.etn-net.org/magazines/en/2001/ETN-TF_4-2001_EN/ETN-TF_4-2001_EN_31.jpg" urls_to_load.extend([a, b]) # add them to the url list # add all other images, generating their names as we need for i in range(2, 31): # it is important to make this second number +1, so PY makes the list correctly (as far as we start with 2) a = "https://member.etn-net.org/magazines/en/2001/ETN-TF_4-2001_EN/ETN-TF_4-2001_EN_" + str(i).zfill(2) + "a.jpg" b = "https://member.etn-net.org/magazines/en/2001/ETN-TF_4-2001_EN/ETN-TF_4-2001_EN_" + str(i).zfill(2) + "b.jpg" urls_to_load.extend([a, b]) # preparing to download if not os.path.exists(path): try: os.mkdir(path) except OSError: print("Creation of the directory %s failed" % path) else: print("Successfully created the directory %s " % path) # starting to download print("Starting downloading") for url in urls_to_load: file_name = path + '/' + os.path.basename(url) # get the full path to the file if os.path.exists(file_name): os.remove(file_name) # if exists, remove it directly file_name = wget.download(url, out=path) print(file_name) print("ok")
Тут смысл в том, что оно умеет по списку ссылок скачивать, а в остальном оно бесполезное, конечно. Просто мне было лень руками 30 ссылок вбивать. И да, будьте внимательнее с копирайтом, соблюдайте закон.
Может быть интересно:
- Select all images urls and download them
- Про Python и ArchiCAD: удалить лишние слои
- Скрипт для выбора победителя в инстаграме (из лайков)
- Вывод дерева файлов через Питон
- Задаём свойства объектам в ArchiCAD 23 через Python