Я пытаюсь загрузить и сохранить изображение из Интернета с помощью requests
модуля Python .
Вот (рабочий) код, который я использовал:
img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
f.write(img.read())
Вот новый (нерабочий) код, использующий requests
:
r = requests.get(settings.STATICMAP_URL.format(**data))
if r.status_code == 200:
img = r.raw.read()
with open(path, 'w') as f:
f.write(img)
Можете ли вы помочь мне с каким атрибутом из ответа использовать requests
?
python
urllib2
python-requests
shkschneider
источник
источник
Ответы:
Вы можете использовать
response.raw
объект файла или выполнить итерацию ответа.Использование
response.raw
файлового объекта по умолчанию не будет декодировать сжатые ответы (с помощью GZIP или deflate). В любом случае вы можете принудительно распаковать его, установив дляdecode_content
атрибута значениеTrue
(requests
задаетFalse
для управления самим декодированием). Затем вы можете использоватьshutil.copyfileobj()
Python для потоковой передачи данных в файловый объект:Для перебора ответа используйте цикл; итерация, подобная этой, гарантирует, что данные распаковываются на этом этапе:
Это прочитает данные в 128 байтных чанках; если вы чувствуете, что другой размер чанка работает лучше, используйте
Response.iter_content()
метод с пользовательским размером чанка:Обратите внимание, что вам нужно открыть файл назначения в двоичном режиме, чтобы python не пытался переводить переводы строк для вас. Мы также настроили
stream=True
так, чтобыrequests
сначала не загружать все изображение в память.источник
r2 = requests.post(r.url, data); print r2.content
. Но теперь я тоже хочу знатьfilename
. их какой-нибудь очищенный способ? - в настоящее время я нашел имя файла в заголовке -r2.headers['content-disposition']
это дает мне вывод как:'attachment; filename=DELS36532G290115.csi'
я анализирую эту строку для имени файла ... их какой-либо более чистый способ?content-disposition
заголовок это путь сюда; использоватьcgi.parse_header()
для его анализа и получения параметров;params = cgi.parse_header(r2.headers['content-disposition'])[1]
тогдаparams['filename']
.requests.Response
себя :for chunk in r: ...
. Вызовiter_content()
без операцииchunk_size
будет повторяться в 1-байтовых чанках .response.ok
никогда не был задокументирован, и он дает истину для любого статуса 1xx, 2xx или 3xx, но только ответ 200 имеет тело ответа.Получите объектоподобный объект из запроса и скопируйте его в файл. Это также позволит избежать одновременного считывания всего этого в память.
источник
r.raw.decode_content = True
раньше,shutil.copyfileobj(response.raw, out_file)
потому чтоby default, decode compressed responses (with GZIP or deflate)
, так что вы получите изображение с нулевым файлом.Как насчет этого, быстрое решение.
источник
f = open("/Users/apple/Desktop/sample.jpg", 'wb')
что ты имеешь ввиду под этим путем ?! Я хочу скачать изображениеif response.ok:
У меня такая же потребность в загрузке изображений с использованием запросов. Сначала я попробовал ответ Martijn Pieters, и он хорошо работает. Но когда я сделал профиль для этой простой функции, я обнаружил, что она использует так много вызовов функций по сравнению с urllib и urllib2.
Затем я попробовал способ, рекомендованный автором модуля запросов:
Это значительно уменьшило количество вызовов функций и ускорило работу моего приложения. Вот код моего профилировщика и результат.
Результат для testRequest:
И результат для testRequest2:
источник
chunk_size
параметр, который по умолчаниюiter_content
равен 1, поэтому выполняется итерация по потоку результатов по 1 байту за раз. Смотрите документацию python-requests.org/en/latest/api/… .PIL
тоже нельзя использовать ,with open(image_name, 'wb') as outfile: outfile.write(r.content)
достаточно просто .PIL
также отсутствует в стандартной библиотеке, что делает его немного менее переносимым.iter_content
медленный, потому что вашchunk_size
слишком мал, если вы увеличите его до 100k, это будет намного быстрее.Это может быть проще, чем использовать
requests
. Это единственный раз, когда я советую не использоватьrequests
HTTP-вещи.Два лайнера с использованием
urllib
:Есть также хороший модуль с именем Python,
wget
который довольно прост в использовании. Нашел здесь .Это демонстрирует простоту конструкции:
Наслаждаться.
Редактировать: Вы также можете добавить
out
параметр, чтобы указать путь.источник
wget
без каких-либо неприятностей. Спасибо за указание преимуществ использованияurllib3
urllib.request.urlretrieve("http://example.com", "file.ext")
.Следующий фрагмент кода загружает файл.
Файл сохраняется с именем файла, как указано в URL.
источник
Есть 2 основных способа:
Используя
.content
( самый простой / официальный) (см. Ответ Женьи Чжана ):Используя
.raw
(см . Ответ Мартин Питерс ):Сроки оба не показывают заметной разницы.
источник
1.
ответ (с использованиемio.BytesIO
иImage
) был первым, который работал для меня на Python 3.6. Не забывайтеfrom PIL import Image
(иpip install Pillow
).Так же просто, как импортировать изображения и запросы
источник
Вот более удобный ответ, который все еще использует потоковую передачу.
Просто определите эти функции и вызовите
getImage()
. Он будет использовать то же имя файла, что и URL, и будет записывать в текущий каталог по умолчанию, но оба они могут быть изменены.В
request
ВнутренностиgetImage()
основаны на ответ здесь и кишкахgetImageFast()
основаны на ответ выше .источник
Я собираюсь опубликовать ответ, так как мне не хватает представителя, чтобы оставить комментарий, но с помощью wget, опубликованной Blairg23, вы также можете указать параметр out для пути.
источник
Это первый ответ, который появляется в поиске Google о том, как загрузить двоичный файл с запросами. Если вам нужно скачать произвольный файл с запросами, вы можете использовать:
источник
.close()
. Наверное, это лучший ответ на 2019 год.Вот как я это сделал
источник
Вы можете сделать что-то вроде этого:
источник