[Python] Функция сохраняет картинки из Яндекса по запросу.

errogaht

Постоялец
Регистрация
15 Май 2013
Сообщения
50
Реакции
10
Наполнял ИМ товарами и так было лень самому картинки искать.

Написал функцию 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
 
Последнее редактирование:
А у вас дубли не проскакивали? Не подскажите как с ними бороться? Интересует проверка на схожесть двух изображений.
 
А у вас дубли не проскакивали? Не подскажите как с ними бороться? Интересует проверка на схожесть двух изображений.
дубль может быть если одно и тоже изображение на нескольких сайтах размещено - конечно такое может быть и часто

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

лучше использовать собственную голову))
 
Последнее редактирование:
дубль может быть если одно и тоже изображение на нескольких сайтах размещено - конечно такое может быть и часто

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

лучше использовать собственную голову))

Для транслитерации советовал бы использовать библиотеку trans

Python 3:

>>> from trans import trans
>>> trans('Привет, Мир!')

Python 2:

>>> import trans
>>> u'Привет, Мир!'.encode('trans')
u'Privet, Mir!'
>>> trans.trans(u'Привет, Мир!')
u'Privet, Mir!'
 
Назад
Сверху