Недавно пришлось по работе написать простенький парсер на питоне, который бы скачивал с сайта изображения (по идее тот же самый парсер может качать не только изображения, но и файлы других форматов) и сохранял их на диске. Всего я нарыл в интернете четыре метода. В этой статье я их решил собрать все вместе.
Методы к вашим услугам по порядку:
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="(.*?)"', urlContent)
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 (и с другими), написать в комментариях аналогичный метод по скачиванию изображений с помощью этой и других библиотек.
Автор: maratvildan