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

Тема в разделе "Perl, Python, Ruby", создана пользователем errogaht, 13 мар 2014.

  1. errogaht

    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
     
    Последнее редактирование: 13 мар 2014
    Ultharas нравится это.
  2. murzikBSUIR

    murzikBSUIR Создатель

    Регистр.:
    27 мар 2009
    Сообщения:
    17
    Симпатии:
    2
    А у вас дубли не проскакивали? Не подскажите как с ними бороться? Интересует проверка на схожесть двух изображений.
     
  3. errogaht

    errogaht Постоялец

    Регистр.:
    15 май 2013
    Сообщения:
    50
    Симпатии:
    10
    дубль может быть если одно и тоже изображение на нескольких сайтах размещено - конечно такое может быть и часто

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

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

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    А еще лучше использовать собственную голову в связке с подходящей библиотекой :ay:
    Перейти по ссылке)
     
    Последнее редактирование: 6 апр 2014
  5. Ultharas

    Ultharas Создатель

    Регистр.:
    26 сен 2014
    Сообщения:
    27
    Симпатии:
    10
    Для транслитерации советовал бы использовать библиотеку trans

    Python 3:

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

    Python 2:

    >>> import trans
    >>> u'Привет, Мир!'.encode('trans')
    u'Privet, Mir!'
    >>> trans.trans(u'Привет, Мир!')
    u'Privet, Mir!'