Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Четыре способа загрузки изображений с веб-сайта с поддержкой Python

Anna | 15.06.2014 | нет комментариев

Недавно пришлось по работе написать простенький парсер на питоне, тот, что бы скачивал с сайта изображения (по идее тот же самый парсер может качать не только изображения, но и файлы других форматов) и сберегал их на диске. Каждого я обнаружил в интернете четыре способа. В этой статье я их решил собрать все совместно.

Вот эти способы:

1-ый способ

1-й способ использует модуль urllib (либо же urllib2). Пускай имеется ссылка на некое изображение img. Способ выглядит дальнейшим образом:

import urllib

resource = urllib.urlopen(img)
out = open("...\img.jpg", 'wb')
out.write(resource.read())
out.close()

Тут необходимо обратить внимание, что режим записи для изображений — ‘wb’ (бинарный), а не легко ‘w’.

2-ой способ

2-й способ использует тот же самый urllib. В последующем будет показано, что данный способ чуть неторопливей первого (негативный оттенок фактора скорости парсинга неоднозначен), но достоин внимания из-за своей краткости:

import urllib
urllib.urlretrieve(img, "...\img.jpg")

Притом стоит подметить, что функция urlretrieve в библиотеке urllib2 по незнакомым мне причинам (может кто подскажет по каким) отсутствует.

3-ий способ

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB