Pull to refresh

Comments 29

вкусно и компактно пишете, спасибо, годная заметка — ничего лишнего!

и отдельно спасибо за UPX, как раз вот-вот понадобится упаковщик.
и отдельное спасибо за ваш appid ;)
вы совсем с ума посходили? это же все равно, что святым мячом на стороне дьявола воевать!
мало минусов, хочу еще
Никогда не откажу тебе в просьбе, поэтому воткнул минусик :-)
Обычно так и получается ;( Сатана льстив… Ну и черт с ним. И в аду будут яблони цвести (В смысле и MS будет опенсорсом :).
О, неожиданно. Прочитал с удовольствием. Автор, спасибо.
Для .exe попробуйте еще PyInstaller — он сразу и .exe умеет делать.

Для скачивания вместо threading лучше пользовать pycurl и можно мою функцию multi_get (описание на Хабре, исходник)

Тогда весь код становится примерно таким (и умеет хорошо обрабатывать таймауты и не нужно lock и threads):

import multi_get
import json
import urllib
import sys
 
urlencode = lambda a:urllib.urlencode({'':a})[1:]
 
surl = "api.search.live.net/json.aspx?appid=4EFC2F2CA1F9547B3C048B40C33A6A4FEF1FAF3B" + \
                   "&sources=image&query=" + urlencode(sys.argv[2])
 
# Берем результат Bing
 
res = {}
multi_get.multi_get(res, urls,  timeout = 30)
 
response = json.load(res[surl])
results = response["SearchResponse"]["Image"]["Results"]
urls = list(result["MediaUrl"] for result in results)
 
# Качаем все изображения
 
res = {}
multi_get.multi_get(res, urls,  timeout = 10)
 
# Сохраняем их
 
n = 
for url, txt in res.iteritems():
  n += 1
  f = open('%s.jpg' % n, 'wb')
  f.write(txt)
  f.close()

Код не тестированный на синтаксические ошибки. И конечно доработать напильником под нужды (много страниц, правильные имена файлов, а не только .jpg), это общая идея.

pycurl под 2.6 (судя по тому, что json используете) лежит здесь longsincefaded.com/curl/, под линукс следите чтобы была сборка с библиотекой c-ares — по умолчанию это не так и будет жутко тормозить из-за не асинхронных dns запросов.
Там n = 0, нолик куда-то Хабр скушал.
да и вместо urls в первом должно быть [surl,]
Спасибо за PyInstaller и multi_get, буду пробовать.
# import used libraries
import urllib, json, sys, os, threading
Добавил ссылку в конце поста
Интересно, насколько легальна такая автоматическая сборка изображений. И сразу два подвопроса:

1. Насколько нелегальна сборка изображений с сайтов. Ясно что нельзя собирать изображения от куда попало, ибо на изображениях могут быть копирайты. Вопрос как бы сделать так, чтобы сборка проходила только с сайтов где изображения без коммерческих лицензий. Например Google API позволяет указать тип лицензии на изображения при запросе (но я сомневаюсь что механизм надежен). Еще можно указать в запросе что сбор должен идти только с определенного сайта (с заведомо свободными изображениями), но API позволяют указать только один сайт, но не список.

2. Насколько поисковики Bing, Google и п.р… вообще согласны с таким использованием своего API. Думаю что они явно API открывали не для таких целей и у них могут быть притенении к его нецелому использованию.
1. Ничего нелегального тут нет. Если кто-то что-то выложил в сеть на общий доступ, то понятное дело, что он соглашается с тем, что это могут скачать. А уж чем — руками через браузер или программой — всё равно. Другой вопрос — использование.
2. API как раз для таких целей и выкладывается. Для крайних случаев как раз и вводится APP_ID (на который можно повесить по кол-ву использований в день) или просто сильно ограничивается число ответов (как поступил Google)
1. На многих сайта явно указано, что любое копирование любой информации без разрешения владельца запрещено. На счет того, что «раз выложил значит согласен что могут скачать» это врядли. Понимают что могут скачать, но не факт что согласен, и не факт что не будет предпринимать действий против скачавшего.

2. Может быть я и параноюсь, но судя по лицензионному соглашению, они рассчитывают что API будет в основном использовано для выдачи поисковых результатов релевантных текущей странице. И обязательно с указанием логотипа поисковика. Есть много ограничений, хотя явно не сказано что запрещено делать грабберы. Но сказано, что API не должно быть использовано для ресурсов, основной целью которого является поиск.
На ubuntu 9.10 при запросе содержащим русские символы валится с "'ascii' codec can't decode byte 0xd0 in position 2: ordinal not in range(128)" в 100 строке. Лечится если os.path.basename(image_url),\ заменить на os.path.basename(str(image_url)),\
Приятно видеть, когда человек старается узнать что-то новое и при этом не боится выставлять свои изыскания на показ.

Несколько замечаний по стилю Python кода:

— не надо стараться писать комментарии к каждой строчке кода, особенно
# close
something.close()

— стоит писать код так, чтобы он сам себе был комментарием

— в Питоне есть удобная штатное средство docstring, очень желательно в них коротко описывать параметры функции и возвращаемые значения

— очень плохо прятать исключения в слепой try: except:

— сообщения об ошибках лучше выводить в STDERR, а не в STDOUT

— внимательно прочитайте что такое with и почему в нем не имеет смысле f.close()

Вообще, на Питоне надо стараться не писать как на «еще одном Бэйсике» или «на Паскале с отступами», чем раньше переступите через эти шаблоны, тем лучше. Особенно это касается ООП.

Утверждение для затравки — операторы class и def в Питоне по сути являются операторами присваивания.
(тут надо сделать умное лицо и попытаться понять что и куда они присваивают :)

try:
# open connection to URL
socket = urllib.urlopen(url)
# read data
data = socket.read()
# close connection
socket.close()
# on all exceptions
except:
print «error loading», url
# if no exceptions

)))

1. вас на 10-11 запросе просто забянят.
2. где треды то ) вы же не на пыхе сидите
3. а чем гугло плох? там картинок то в разы больше
1. Забирал по 1000, как-то не банят.
2. Треды в коде.
3. Вы пост читали?
Сам учу Python, полезно, понравилось.
Только почитайте PEP 8, есть пара недочетов. :)
упс, вверху уже есть комментарий. извиняюсь.
with open(filename, 'wb') as f:
            # and save data
            f.write(data)
            f.close()


а разве with сам не закроет файл?
<code>
                loader = threading.Thread(\
                    target = load_url,\
                    args=(\
                          image_url,\
                          dir_name + os.path.basename(str(image_url)),\
                          filesystem_lock))
</code>


В этом случае не обязательно ставить обратные слеши.

Написали скриптец, да. Вы молодец, но в статье абсолютно ничего интересного. Если бы реализовали pyBing или типа того, а так…
Sign up to leave a comment.

Articles