errogaht
Постоялец
- Регистрация
- 15 Май 2013
- Сообщения
- 50
- Реакции
- 10
- Автор темы
- #1
Наполнял ИМ товарами и так было лень самому картинки искать.
Написал функцию SaveImageYandex(text, imageCount, path, w='800', h='600')
text - запрос по которому ищем
imageCount - количество картинок сохраняем
path - полный путь куда сохраняем
w и h - минимальные размеры картинки
Работает только с .jpg
Я использую так: у меня есть .txt список названий товаров (ASCII кодировка only!)
я его перебираю и для каждого товара сохраняется по 5 картинок.
Причем на выходе получаем файлы типа:
1. имя-1.jpg
1. имя-2.jpg
1. имя-3.jpg
для следующей строки из списка:
2. имя-1.jpg
2. имя-2.jpg
2. имя-3.jpg
на выходе еще получаем файл out.txt в котором для каждой строки списка изначального получается такая штука:
1. имя.jpg
2. имя.jpg
После того как я сохранил кучу картинок то открываю их, и из 5 картинок оставляю только одну - самую лучшую.
Дальше запускаю функцию deleteNumerators('D:\path')
которая переименовывает все файлы типа "2. имя-1.jpg" в "2. имя.jpg"
В итоге на выходе получаем папку с кучей картинок и файл out.txt с названием сохраненных картинок
причем в файле этом строки расположенны точно также как и в исходном файле.
Потом я загружаю данный файл в таблицу ИМ через exel и картинки через фтп.
И в итоге у меня у всех товаров картинки.
Используется Grab lib
Также используется мини библиотека для транслита:
Написал функцию SaveImageYandex(text, imageCount, path, w='800', h='600')
text - запрос по которому ищем
imageCount - количество картинок сохраняем
path - полный путь куда сохраняем
w и h - минимальные размеры картинки
Работает только с .jpg
Я использую так: у меня есть .txt список названий товаров (ASCII кодировка only!)
я его перебираю и для каждого товара сохраняется по 5 картинок.
Причем на выходе получаем файлы типа:
1. имя-1.jpg
1. имя-2.jpg
1. имя-3.jpg
для следующей строки из списка:
2. имя-1.jpg
2. имя-2.jpg
2. имя-3.jpg
на выходе еще получаем файл out.txt в котором для каждой строки списка изначального получается такая штука:
1. имя.jpg
2. имя.jpg
После того как я сохранил кучу картинок то открываю их, и из 5 картинок оставляю только одну - самую лучшую.
Дальше запускаю функцию deleteNumerators('D:\path')
которая переименовывает все файлы типа "2. имя-1.jpg" в "2. имя.jpg"
В итоге на выходе получаем папку с кучей картинок и файл out.txt с названием сохраненных картинок
причем в файле этом строки расположенны точно также как и в исходном файле.
Потом я загружаю данный файл в таблицу ИМ через exel и картинки через фтп.
И в итоге у меня у всех товаров картинки.
Используется Grab lib
Код:
# -*- coding: utf-8 -*-
from grab import Grab
import logging
import re
import urlparse
import urllib
import os
from translite import transliterate as trans
logger = logging.getLogger('grab')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
def golink(g, text):
url = g.find_link(text)
g.go(url)
#golink(g, 'imghp')
# g.set_input('q', u'лол')
# g.submit()
def GetFileExtFromURL(fullpath):
(root, ext) = os.path.splitext(urlparse.urlparse(fullpath).path)
return ext
def StringForFilename(string):
string = trans(string)
string = re.sub(r"[\s]", "-", string)
string = re.sub("[^qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-]", "", string)
return string
prefix = 0
def deleteNumerators(path):
listing = os.listdir(path)
for file in listing:
new = re.sub(r"(.*)-\d+?(\.[^.]+?)$", r"\1\2", file)
new = path + "\\" + new
old = path + "\\" + file
try:
os.rename(old, new)
except:
pass
def SaveImageYandex(text, imageCount, path, w='800', h='600'):
global prefix
prefix += 1
g = Grab(connect_timeout=5, userpwd='user:pass', debug_post='True', log_dir='log', headers={'Accept-Language': 'ru,en;q=0.8'})
query = urllib.urlencode({'text': text.encode('utf-8'), 'iw': w, 'ih': h})
url = 'http://images.yandex.ru/yandsearch?isize=gt&itype=jpg&'+query
g.go(url)
image_number = 0
f2 = open('out.txt', 'a')
filename = str(prefix) + '-' + StringForFilename(text) + '.jpg'
f2.write(filename + '\n')
f2.close()
while image_number < imageCount:
image_number += 1
tmp = g.doc.select('//html/body/div[2]/div/div[2]/div[2]/div[1]/div[contains(@class, "b-images-item")]['
+ str(image_number) + ']').attr('onclick')
match = re.search(r'"fullscreen":\{"url":"(.*?)"', tmp)
if match:
image_URL = match.group(1)
print str(image_number) + '. ' + image_URL
ext = GetFileExtFromURL(image_URL)
filename = str(prefix) + '-' + StringForFilename(text) + '-' + str(image_number) + '.jpg'
try:
urllib.urlretrieve(image_URL, os.path.join(path, filename))
except:
pass
else:
print 'Cant find image for this query ' + str(image_number)
f = open('query.txt')
for line in f.readlines():
SaveImageYandex(u''+line, 5, 'D:\img', '200', '200')
f.close()
# deleteNumerators('D:\img')
Также используется мини библиотека для транслита:
Код:
# -*- coding: utf-8 -*-
def transliterate(string):
capital_letters = {u'А': u'A',
u'Б': u'B',
u'В': u'V',
u'Г': u'G',
u'Д': u'D',
u'Е': u'E',
u'Ё': u'E',
u'З': u'Z',
u'И': u'I',
u'Й': u'Y',
u'К': u'K',
u'Л': u'L',
u'М': u'M',
u'Н': u'N',
u'О': u'O',
u'П': u'P',
u'Р': u'R',
u'С': u'S',
u'Т': u'T',
u'У': u'U',
u'Ф': u'F',
u'Х': u'H',
u'Ъ': u'',
u'Ы': u'Y',
u'Ь': u'',
u'Э': u'E',}
capital_letters_transliterated_to_multiple_letters = {u'Ж': u'Zh',
u'Ц': u'Ts',
u'Ч': u'Ch',
u'Ш': u'Sh',
u'Щ': u'Sch',
u'Ю': u'Yu',
u'Я': u'Ya',}
lower_case_letters = {u'а': u'a',
u'б': u'b',
u'в': u'v',
u'г': u'g',
u'д': u'd',
u'е': u'e',
u'ё': u'e',
u'ж': u'zh',
u'з': u'z',
u'и': u'i',
u'й': u'y',
u'к': u'k',
u'л': u'l',
u'м': u'm',
u'н': u'n',
u'о': u'o',
u'п': u'p',
u'р': u'r',
u'с': u's',
u'т': u't',
u'у': u'u',
u'ф': u'f',
u'х': u'h',
u'ц': u'ts',
u'ч': u'ch',
u'ш': u'sh',
u'щ': u'sch',
u'ъ': u'',
u'ы': u'y',
u'ь': u'',
u'э': u'e',
u'ю': u'yu',
u'я': u'ya',}
capital_and_lower_case_letter_pairs = {}
for capital_letter, capital_letter_translit in capital_letters_transliterated_to_multiple_letters.iteritems():
for lowercase_letter, lowercase_letter_translit in lower_case_letters.iteritems():
capital_and_lower_case_letter_pairs[u"%s%s" % (capital_letter, lowercase_letter)] = u"%s%s" % (capital_letter_translit, lowercase_letter_translit)
for dictionary in (capital_and_lower_case_letter_pairs, capital_letters, lower_case_letters):
for cyrillic_string, latin_string in dictionary.iteritems():
string = string.replace(cyrillic_string, latin_string)
for cyrillic_string, latin_string in capital_letters_transliterated_to_multiple_letters.iteritems():
string = string.replace(cyrillic_string, latin_string.upper())
return string
Последнее редактирование: