...

суббота, 25 января 2014 г.

Четыре метода загрузки изображений с веб-сайта с помощью 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="(.*?)"', urlContent)

start = time.time()
for img in imgUrls:
if img.endswith(".jpg"):
"""реализация метода по загрузке изображения из url"""

print time.time()-start


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
















Таблица сравнения скоростей методов
Метод 1, сМетод 2, сМетод 3, сМетод 4, с (без кэширования, с)
0.8230.9080.8740.089 (7.625)



Данные представлены как результат усреднения результатов семи измерений.

Просьба к тем, кто имел дело с библиотекой Grab (и с другими), написать в комментариях аналогичный метод по скачиванию изображений с помощью этой и других библиотек.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий