Как скачать картинку requests python
Перейти к содержимому

Как скачать картинку requests python

  • автор:

Загрузка файлов на сервер модулем requests в Python

Для понимания этого материала необходимо ознакомиться с передачей дополнительных параметров в запросе методом POST, который представлен в ознакомительной статье к библиотеке requests .

  • Отправка одного файла на сервер.
  • Отправка нескольких файлов на сервер.

Отправка одного файла на сервер.

Библиотека requests упрощает загрузку файлов на сервер с многосоставной кодировкой Multipart-encoded . Для этого, в словарь с дополнительными параметрами POST запроса необходимо добавить ключ ‘file’ , а в качестве его значения указать объект открытого файла с помощью функции open() в двоичном режиме ‘rb’ :

Сразу смотрим пример:

>>> import requests # целевой URL-адрес >>> url = 'https://httpbin.org/post' # открываем файл на чтение в # бинарном режиме ('rb') >>> fp = open('report.xls', 'rb') # помещаем объект файла в словарь # в качестве значения с ключом 'file' >>> files = 'file': fp> # передаем созданный словарь аргументу `files` >>> resp = requests.post(url, files=files) >>> fp.close() >>> resp.text # # . # "files": # "file": "" # >, # . # > 

Можно явно указать имя файла, content_type и другие заголовки в значении ключа file создаваемого словаря, для передачи файла на сервер:

>>> import requests >>> url = 'https://httpbin.org/post' >>> fp = open('report.xls', 'rb') # указываем дополнительные заголовки и параметры >>> files = 'file': ('report.xls', fp, 'application/vnd.ms-excel', 'Expires': '0'>)> >>> resp = requests.post(url, files=files) >>> fp.close() >>> resp.text # # . # "files": # "file": "" # >, # . # > 

При желании, вместо самого файла можно отправить строку, представляющую контент файла:

>>> import requests >>> url = 'https://httpbin.org/post' >>> files = 'file': ('report.csv', 'some, data, to, send\nanother, row, to, send\n')> >>> resp = requests.post(url, files=files) >>> resp.text # # . # "files": # "file": "some,data,to,send\\nanother,row,to,send\\n" # >, # . # > 

Отправка нескольких файлов на сервер.

Постоянно возникают ситуации, когда необходимо отправить несколько файлов на сервер в одном запросе. Например, предположим, что надо загрузить файлы изображений в HTML-форму с несколькими полями из файлов изображений .png :

input type="file" name="images" multiple="true" required="true"/> 

Для этого просто передаем файловые объекты (предварительно открытые функцией open() в двоичном режиме ‘rb’ ) в список кортежей следующего вида (form_field_name, file_info) :

>>> import requests # целевой адрес с формой отправки >>> url = 'https://httpbin.org/post' # добавляем файловые объекты в список кортежей >>> multiple_files = [ . ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')), . ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))] # делаем запрос >>> resp = requests.post(url, files=multiple_files) >>> resp.text  . 'files': 'images': 'data:image/png;base64,iVBORw . '> 'Content-Type': 'multipart/form-data; boundary=31316. ', . > 

Предупреждение. Настоятельно рекомендуется открывать файлы в двоичном режиме ‘rb’ . Это связано с тем, что запросы могут попытаться предоставить заголовок Content-Length , и если это произойдет, то это значение будет установлено на количество байтов в файле. При открытии файла в текстовом режиме могут возникнуть ошибки.

  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • GET и POST запросы c модулем requests
  • Получение/отправка заголовков сервера модулем requests
  • Извлечение и установка cookies с модулем requests
  • Сессии/сеансы Session() модуля requests
  • Объект ответа сервера Response модуля requests
  • Получение и отправка данных в виде JSON с модулем requests
  • Установка timeout для модуля requests
  • Объект PreparedRequest модуля requests
  • Загрузка файлов на сервер модулем requests
  • Загрузка больших данных модулем requests
  • HTTP-прокси или SOCKS-прокси с модулем requests
  • Использование хуков модуля requests
  • Аутентификация с модулем requests
  • SSL и модуль requests

Requests

requests — это библиотека, с помощью которой можно делать запросы в интернет. Само слово “requests” переводится как запросы. Вот как сделать запрос на сайт google.com:

import requests url = 'https://google.com' response = requests.get(url) response.raise_for_status() 

Функция requests.get() делает запрос к сайту google.com, а в переменной response теперь ответ от сайта. Ответ — это не строка и не число. Это сложный объект, в котором есть много всего. Подробнее об этом можно посмотреть в слайдах.

Строчка response.raise_for_status() нужна для того, чтобы проверить, понял вас сервер или нет. Если сервер вернёт 404 «Ресурс не найден», то в response не будет странички сайта google.com, а будет только “Ошибка 404”. Если не вызвать raise_for_status , программа подумает, что всё в порядке, что вы так и хотели: отправить запрос на страницу, которой нет. Обязательно вызывайте .raise_for_status() после каждого запроса в интернет, иначе вы рискуете потратить кучу времени на поиск ошибки, которую замалчивает библиотека requests .

Всегда вызывайте .raise_for_status()

Вот как получить текст ответа от сервера:

print(response.text) 

В ответ вы получите огромный HTML-документ одной строкой. Начинаться будет так:

Именно это получает ваш браузер, когда вы заходите на сайт google.com, и из этого он уже отрисовывает красивую страничку.

Но стоит понимать, что requests может скачивать не только HTML-документы, а буквально всё, что есть в интернете.

Вот как скачать картинку:

import requests url = "https://dvmn.org/filer/canonical/1542890876/16/" response = requests.get(url) response.raise_for_status() filename = 'dvmn.svg' with open(filename, 'wb') as file: file.write(response.content) 

То же самое: делаем запрос по ссылке, получаем ответ, потом сохраняем его в файл. Единственное отличие в том, что вместо response.text для картинок используется response.content , потому что картинка — это не текст.

.text — для текста, .content — для картинки

Узнать больше

  • Руководство по работе с requests
  • Работа с файлами в Python
  • Больше о кодах состояния HTTP

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Статья Парсим и скачиваем «нескучные обои» с использованием потоков в Python

». Привет, Денис Попов . Ну, а если более серьезно, то скачаем картинки с обоями с сайта, на котором их очень и очень много. Конечно же, для того, чтобы скачать картинки мы будем использовать Python, а загрузка картинок будет происходить в многопоточном режиме. Ну и наиболее полезная часть данной статьи состоит в том, что мы немного попрактикуемся в парсинге.

000.jpg

Что понадобиться?

Для отправки запросов и скачивание картинок будем использовать библиотеку requests. Для того, чтобы распарсить полученные результаты и получить из них ссылки на картинки BeautifulSoup и lxml. Поэтому, для начала их нужно установить:

pip install bs4 requests lxml

В работе скрипта так же потребуется библиотека для создания потоков threading, а так же библиотеки time, os и json. Поэтому перед началом работы давайте все это импортируем в наш скрипт.

import json import os.path import threading import time import requests from bs4 import BeautifulSoup

Сайт, с которого будет происходить скачивание обоев,
Ссылка скрыта от гостей

, на самом деле очень лоялен ко всякого рода попыткам его парсить. Он не сбрасывает соединение, не психует и не нервничает, когда к нему прилетает слишком много запросов. Идеальный пациент, можно сказать. Думаю, что он будет отдавать все данные даже в том случае, если мы не станем указывать заголовки запроса. Но, все же, чтобы работать по правилам и попрактиковаться, создадим их. Идем на сайт и смотрим заголовки в любом запросе. Забираем user-agent и accept.

Для этого щелкаем правой кнопкой мыши и в Яндекс.Браузере выбираем пункт «Исследовать элемент». Если же это будет Edge, то данный пункт называется «Проверить». Ну и так далее. Суть в том, что нужно попасть в инструменты разработчика.

Заголовки для запроса

screenshot1.png

Копируем их и вставляем в скрипт:

headers = < 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.119 ' 'YaBrowser/22.3.0.2434 Yowser/2.5 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,' 'application/signed-exchange;v=b3;q=0.9 ' >

Функция получения пагинации

Давайте для начала создадим функцию получения пагинации со страницы из категории. Назову ее get_page_count(url). На вход она принимает только лишь один параметр, это ссылка на страницу категории. Далее выполняется запрос и полученные данные передаются в BeautifulSoup. После этого ищем блок с тэгом div, у которого id=pages. Получаем из этого блока все ссылки на страницы и забираем последнюю ссылку. Далее, разделяем ее и обрезаем лишние пробелы. Но, опытным путем было выявлено, что в некоторых категориях нет стрелки в тексте последней ссылки. Так как количество страниц с картинками помещается в блок пагинации целиком. И в этом случае скрипт падает с ошибкой. Для этого добавим блок try – except, чтобы эту ошибку отловить и просто забрать текст, без обрезки, из последней ссылки в блоке пагинации.

Полный код функции получения пагинации

def get_page_count(url): req = requests.get(url=url, headers=headers) soup = BeautifulSoup(req.text, 'lxml') try: page_count = int(soup.find('div', ).find_all('a')[-1].text.split(" ")[1].strip()) except: page_count = int(soup.find('div', ).find_all('a')[-1].text.strip()) return page_count

Получение ссылок на категории, названия категорий и количества страниц в каждой из них

Для того, чтобы названия категорий, ссылки на них и количество страниц в каждой категории хранились локально, нужно их во что-то сохранить. Я решил, что удобнее всего это будет сделать в файл JSON. А для того, чтобы ускорить получение ссылок на категории и прочих параметров, буду обрабатывать это в многопоточном режиме.

Для начала напишем функцию для нахождения названия категории, ссылки на нее и количества в ней страниц. Назвал я ее def get_link_category(url). На вход она получает ссылку на категорию. И дальше в коде для начала формируется общая ссылка на категорию. Потом ссылка, которую передали в функцию разделяется по слэшу и снова собирается для записи этой ссылки, в которой уже нет привязки к определенной странице, для записи в JSON. Это будет нужно для того, чтобы впоследствии брать ссылку из JSON и формировать из нее ссылку на загрузку пагинации и прочих параметров с определенной страницы.

Ну и последний я нахожу наименование категории. Именно оно будет служить ключом в словаре, который запишется в JSON. Формирую словарь и записываю в файл.

Вот полный код функции

def get_link_category(url): url_cats = 'https://w-dog.ru' + url.find('div', class_='word').find('a')['href'] url_cat = str('https://w-dog.ru' + url.find('div', class_='word').find('a')['href']).split("/") url_cat_s = f'/////' name_category = url.find('div', class_='word').find('a').text.strip() p_count = get_page_count(url_cats) category_dict[name_category] = < 'url_category': url_cat_s, 'page_count': p_count >with open('category_res.json', 'w', encoding='utf-8') as file: json.dump(category_dict, file, indent=4, ensure_ascii=False)

Чтобы было понятнее. В данной функции получаются данные только из одной категории. А вот каждая последующая ссылка на категорию передается из функции, в которой запускаются потоки. Назвал я ее def thread_func_category(). На входе она ничего не принимает. В ней есть ссылка, по которой делается запрос на страницу и собираются все ссылки на категории, которые потом записываются в словарь.

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

Полный код функции старта потоков загрузки ссылок на категории:

def thread_func_category(): url = 'https://w-dog.ru/' req = requests.get(url=url, headers=headers) soup = BeautifulSoup(req.text, 'lxml') all_category = soup.find_all('div', class_='wpitem category') for url in all_category: t = threading.Thread(target=get_link_category, kwargs=) t.start()

Загрузка картинок из категории, выбранной пользователем

Теперь можно перейти к важной части, а именно к загрузке картинок обоев из категории, которую указал пользователь. Назову ее get_pict_download(item, name_cat). Здесь на вход прилетает объект из найденных ссылок страницы, а так же имя категории. Оно будет нужно для того, чтобы указать папку с именем категории и загрузить в нее картинки. На первом этапе ищется имя картинки, под которым она будет сохранена и это имя очищается от мусора в виде всяких специальных символов, которые не совместимы с сохранением файлов в операционной системе.

Затем делается проверка на наличие картинки с данным названием в папке. Если такого названия нет, то картинка загружается. Если же есть, то не делается ничего. Это позволяет не дублировать загрузку одних и тех же картинок с перезаписью. Что позволяет, в случае, если вы не докачали категорию, а вы можете ее не докачать, так как картинок там о-о-очень много, ускорить работу скрипта. Ну и дальше формируется ссылка на картинку, после чего происходит ее загрузка и запись на диск.

Код загрузки картинки:

def get_pict_download(item, name_cat): name_pict = item.find('b', class_='word').text.strip().replace("/", " ").replace('"', ''). \ replace("'", "").replace(".", "") if not os.path.isfile(os.path.join(name_cat, f'.jpg')): url_pict = 'https://w-dog.ru' + item.find('div', class_='action-buttons').find('a')['href'] req = requests.get(url=url_pict, headers=headers) with open(os.path.join(name_cat, f'.jpg'), 'wb') as file: file.write(req.content)

А дальше нужно создать функцию, в которой будут запускаться потоки для скачивания картинок. Назовем ее thread_func(url_cat, count_cat, name_cat). На входе данная функция принимает ссылку на категорию, пагинацию и имя категории.

Затем получаем время старта функции, для измерения скорости загрузки картинок. После выводим сообщение о том, что загружается категория такая-то, такая-то. И количество в ней страниц. От вывода сообщения о загрузке определенной картинки я отказался, потому, что порою вывод просто не успевает отобразиться в терминале. И получается перемешанная каша. Так как в итоге отображается все. Поэтому здесь я ограничился выводом сообщения о загрузке определенной страницы. Далее в цикле запускаем запрос, в котором получаем ссылки на картинки с первой и последующих страниц. Затем данные из запроса передаются в объект супа. Проверяется, если ли папка с именем категории. Если нет, создается. И в цикле запускаются потоки, которые привязаны к функции загрузки картинки и передают в нее необходимые параметры. А после того, как скрипт завершит свою работу, выводиться время загрузки картинок.

Полный код запуска потоков для загрузки картинок

def thread_func(url_cat, count_cat, name_cat): start_time = time.monotonic() print(f'[+] Загружаю категорию "". Количество страниц: \n') if not os.path.isdir(name_cat): os.mkdir(name_cat) for nc in range(1, count_cat + 1): print(f'[+] Загружаю >> Страница: /. ') req = requests.get(url=f"/best/", headers=headers) soup = BeautifulSoup(req.text, 'lxml') all_url_page = soup.find_all('div', class_='wpitem') for item in all_url_page: t = threading.Thread(target=get_pict_download, kwargs=) t.start() print(f'\nВремя загрузки файлов: ')

Осталась только функция main(). В ней для начала запускается функция обновления словаря. Мало ли что, может быть за время, пока не использовался скрипт появились новые категории или добавились обои и поэтому количество страниц может измениться. Тут есть один нюанс, который заключается в том, что запись категорий в словарь будет каждый раз производиться в произвольном порядке, а именно в порядке завершения работы потока. Поэтому отображение категорий всегда будет выводиться по-разному. Ну, или почти всегда. Далее делается небольшая пауза, чтобы дать сохраниться файлу на диск. Так как если этой паузы не делать, скрипт продолжает свою работу, файл еще не успевает сохраниться. А так как на следующем этапе этот словарь открывается для чтения, скрипт вываливается с ошибкой, что файл не найден. Потом формируется словарь из открытого JSON, с помощью которого определяется название категории, а так же ссылка и количество страниц.

Затем выводятся названия категорий на экран с определенными номерами. После чего выводиться сообщение с просьбой ввести номер категории для загрузки. Выполняется проверка, есть ли данный номер словаре. Если нет, ничего не делаем. Если есть, запускаем загрузку картинок.

Код функции main()

def main(): print('[+] Обновляю словарь. \n') thread_func_category() time.sleep(2) with open('category_res.json', 'r', encoding='utf-8') as file: cat_dict = json.load(file) dict_cat = <> for num, cat in enumerate(cat_dict): print(f'. | страниц. ') dict_cat[num] = < 'url_category': cat_dict[cat]["url_category"], 'page_count': cat_dict[cat]["page_count"], 'name_cat': cat >num_cat = int(input('\n[+] - Введите номер категории для загрузки: ')) # передача данных для запуска потоков загрузки картинок if num_cat in dict_cat: thread_func(f"/", dict_cat[num_cat]['page_count'], dict_cat[num_cat]['name_cat']) else: print('[-] Вы ввели неверный номер категории для загрузки.') exit(0)

На этом все. Нужно сказать, что я немного поэкспериментировал и первоначальную версию парсера обоев сделал без использования многопоточной загрузки. И попробовал загрузить какую-либо категорию. Надо сказать, что с такой скоростью загрузки, когда все выполняется последовательно, категорию можно грузить сутками. После чего было решено добавить многопоточность. И о чудо, скорость загрузки увеличилась в разы.

Я пробовал загрузить самую маленькую категорию, в которой шесть страниц. На каждой странице по двенадцать картинок. То есть, получается, что загружается 69. Скорее всего, потому, что некоторые картинки просто повторяются на страницах. Будем считать, что так, я просто не стал проверять. Так как это слишком долго и муторно. Так вот скрипт без потоков работает примерно от одной до двух минут. В зависимости от загруженности сети. А вот скрипт с потоками от пяти до семи секунд.

Вот небольшое видео, в котором я даю некоторые пояснения по сбору данных со страницы, а так же сравниваю скорость работы скрипта:

Полный код скрипта загрузки обоев

import json import os.path import threading import time import requests from bs4 import BeautifulSoup # заголовки для запроса headers = < 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.119 ' 'YaBrowser/22.3.0.2434 Yowser/2.5 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,' 'application/signed-exchange;v=b3;q=0.9 ' >category_dict = <> # получение пагинации # находим последнюю станицу и чистим от мусора # исключение добавлено потому, что есть разделы, у которых # меньше 7 страниц. В этом случае пагинация немного отличается def get_page_count(url): req = requests.get(url=url, headers=headers) soup = BeautifulSoup(req.text, 'lxml') try: page_count = int(soup.find('div', ).find_all('a')[-1].text.split(" ")[1].strip()) except: page_count = int(soup.find('div', ).find_all('a')[-1].text.strip()) return page_count # получаем ссылки на категории и сохраняем с JSON # получение ссылок происходит при каждом запуске программы # так как считывается так же и количество стараниц в каждой категории # и по прошествии времени оно может изменяться def get_link_category(url): url_cats = 'https://w-dog.ru' + url.find('div', class_='word').find('a')['href'] url_cat = str('https://w-dog.ru' + url.find('div', class_='word').find('a')['href']).split("/") url_cat_s = f'/////' name_category = url.find('div', class_='word').find('a').text.strip() p_count = get_page_count(url_cats) category_dict[name_category] = < 'url_category': url_cat_s, 'page_count': p_count >with open('category_res.json', 'w', encoding='utf-8') as file: json.dump(category_dict, file, indent=4, ensure_ascii=False) def thread_func_category(): url = 'https://w-dog.ru/' req = requests.get(url=url, headers=headers) soup = BeautifulSoup(req.text, 'lxml') all_category = soup.find_all('div', class_='wpitem category') for url in all_category: t = threading.Thread(target=get_link_category, kwargs=) t.start() # загрузка картинок из категории # получение названия категории # создание папки с именем категории куда будут загружаться картинки # поиск всех ссылок настранице, скачивание их в цикле # и сохранение в созданную папку def get_pict_download(item, name_cat, count_cat): name_pict = item.find('b', class_='word').text.strip().replace("/", " ").replace('"', ''). \ replace("'", "").replace(".", "") if not os.path.isfile(os.path.join(name_cat, f'.jpg')): url_pict = 'https://w-dog.ru' + item.find('div', class_='action-buttons').find('a')['href'] req = requests.get(url=url_pict, headers=headers) with open(os.path.join(name_cat, f'.jpg'), 'wb') as file: file.write(req.content) def thread_func(url_cat, count_cat, name_cat): start_time = time.monotonic() print(f'[+] Загружаю категорию "". Количество страниц: \n') for nc in range(1, count_cat + 1): print(f'[+] Загружаю >> Страница: /. ') req = requests.get(url=f"/best/", headers=headers) soup = BeautifulSoup(req.text, 'lxml') name_cat = soup.find('div', ).find('h2').text.strip() if not os.path.isdir(name_cat): os.mkdir(name_cat) all_url_page = soup.find_all('div', class_='wpitem') for item in all_url_page: t = threading.Thread(target=get_pict_download, kwargs=) t.start() print(f'\nВремя загрузки файлов: ') def main(): print('[+] Обновляю словарь. \n') thread_func_category() time.sleep(2) with open('category_res.json', 'r', encoding='utf-8') as file: cat_dict = json.load(file) dict_cat = <> for num, cat in enumerate(cat_dict): print(f'. | страниц. ') dict_cat[num] = < 'url_category': cat_dict[cat]["url_category"], 'page_count': cat_dict[cat]["page_count"], 'name_cat': cat >num_cat = int(input('\n[+] - Введите номер категории для загрузки: ')) # передача данных для запуска потоков загрузки картинок if num_cat in dict_cat: thread_func(f"/", dict_cat[num_cat]['page_count'], dict_cat[num_cat]['name_cat']) else: print('[-] Вы ввели неверный номер категории для загрузки.') exit(0) if __name__ == "__main__": main()

Python. Requests+bs4 часть 2 WebScrapping [8]

В данном примере, мы создадим программу, которая выводит текущий курс доллара.

Скопируйте себе следующий код.

import requests resp = requests.get("https://www.cbr-xml-daily.ru/daily_json.js").json() print(resp['Valute']['USD']['Value'])

Да, это вся программа. Все что она делает, это получает данные о курсах валют в формате json.


resp = requests.get("https://www.cbr-xml-daily.ru/daily_json.js").json()

.json(), преобразует json данные в Python словарь. Из него, мы получили данные о курсе доллара.

print(resp['Valute']['USD']['Value'])

Скачивание картинок.

В этом примере, мы научимся скачивать мемы, с сайта anekdot.ru.

Перепишите данный скрипт:

import requests from bs4 import BeautifulSoup header = < #user-agent ОБЯЗАТЕЛЕН т.к. сайт не доступен без него 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0' >resp = requests.get("https://www.anekdot.ru/release/mem/day/", headers=header).text soup = BeautifulSoup(resp, 'lxml') images = soup.findAll('img') for image in images: try: image_link = image.get('src') image_name = image_link[image_link.rfind('/')+1:] image_bytes = requests.get(image_link, headers=header).content print(image_link) if not image_link: continue with open(f'images/', 'wb') as f: f.write(image_bytes) except: print('error skipped')
header = < #user-agent ОБЯЗАТЕЛЕН т.к. сайт не доступен без него 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0' >resp = requests.get("https://www.anekdot.ru/release/mem/day/", headers=header).text

Здесь мы получили html страницу, передав в качестве заголовка user-agent, передавать его обязательно, т.к. если этого не сделать, вместо html страницы, получим «Access Denied«.

Далее, получаем все картинки (элементы с тегом img).

soup = BeautifulSoup(resp, 'lxml') images = soup.findAll('img')

В теге img, ищем получаем аргумент src (ссылка на картинку).

image_link = image.get('src')

Из ссылки, извлекаем название картинки.

image_name = image_link[image_link.rfind('/')+1:]

И, скачиваем картинку.

image_bytes = requests.get(image_link, headers=header).content

.content, в отличии от .text и .json, представляет данные в формате байт-кода.

Полученную картинку сохраняем в папке images. Предварительно, создайте папку images, в директории скрипта.

with open(f'images/', 'wb') as f: f.write(image_bytes)

На всякий случай, обернул все это в try/except, что-бы программа пропускала ошибки.

Вот и все, программа теперь умеет скачивать картинки. При желании, вы можете её заставить скачивать музыку и видео.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *