CoderCastrov logo
CoderCastrov
Парсер

Как скачать тысячи фотографий животных, доступных для усыновления, с Petfinder с использованием API Petpy: Часть 2 - Загрузка фотографий животных

Как скачать тысячи фотографий животных, доступных для усыновления, с Petfinder с использованием API Petpy: Часть 2 - Загрузка фотографий животных
просмотров
3 мин чтение
#Парсер
Table Of Content

    Вспомним, что в первой части мы завершили работу с очищенным набором данных, содержащим идентификатор животного, породы и фотографии. Следующим шагом будет решить, какие фотографии мы хотим скачать.

    Сначала нам понадобятся необходимые импорты.

    import petpy
    import os
    import pandas as pd
    import urllib.request
    import urllib.error
    from multiprocessing import Pool
    from multiprocessing.dummy import Pool as ThreadPool

    Мы можем создать 3 столбца размеров для каждого из 3 столбцов с изображениями, чтобы отобразить их размер.

    rabbitCLEANED['small_photo_size'] = rabbitCLEANED['primary_photo_cropped.small'].str.split('width=', 1).str[1].str.split('&', 0).str[0].astype(int)
    rabbitCLEANED['medium_photo_size'] = rabbitCLEANED['primary_photo_cropped.medium'].str.split('width=', 1).str[1].str.split('&', 0).str[0].astype(int)
    rabbitCLEANED['large_photo_size'] = rabbitCLEANED['primary_photo_cropped.large'].str.split('width=', 1).str[1].str.split('&', 0).str[0].astype(int)

    Результатом в нашем наборе данных будут 3 столбца, как показано ниже:

    <Image
      src="/blogs/fde89c505a.jpg"
      width="365"
      height="253"
      alt=""
      sizes="100vw"
    />

    Если мы посмотрим на эти столбцы, мы увидим, что три размера фотографий имеют ширину в пикселях 300, 450 и 600. В этом примере мы будем использовать средний размер, потому что почему бы и нет? Поэтому мы собираемся отфильтровать данные, чтобы оставить только размер 450.

    medphotos = rabbitCLEANED.groupby('id').apply(lambda x: x[x['medium_photo_size'] == 450])

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

    medium = medphotos.groupby('breeds.primary').head(5)

    Мы возьмем необходимые столбцы из rabbitCLEANED и превратим их в списки.

    urls, breed, index = rabbitCLEANED['primary_photo_cropped.medium'].tolist(), rabbitCLEANED['breeds.primary'].tolist(), rabbitCLEANED.index.tolist()

    Затем мы создаем список списков: rabbitlist = [index, breed, urls]

    ‘Мы должны переставить список списков таким образом, чтобы его легко было вводить значения в [процесс Pool](https://github.com/aschleg/petpy/blob/master/notebooks/02-Download%2045%2C000%20Adoptable%20Cat%20Images%20with%20petpy%20and%20multiprocessing.ipynb)при его итерации по значениям.’`

    new_rabbitlist = []
    for i in range(0, len(rabbitlist[0])):
        new_rabbitlist.append([rabbitlist[0][i], rabbitlist[1][i], rabbitlist[2][i]])

    Затем нам нужно разделить фотографии на разные каталоги на основе основной породы. Мы хотим добавить "уникальный", чтобы не было более одной папки для одной и той же породы.

    ��python breed_dirs = new_rabbitlist(medphotos['breeds.primary'].unique()) ��

    Теперь мы можем определить функцию, которая создает папку для всех каталогов пород, называемую rabbit_breeds. Она также назначает изображению имя, которое будет типом породы вместе с идентификатором. Мы также обязательно добавляем обработку ошибок с urllib и HTTPError для получения изображений из URL.

    ��python def download_breed_images(breed_img): try: urllib.request.urlretrieve(breed_img[2], os.path.join('rabbit_breeds/', str(breed_img[1]), str(breed_img[1]) + str(breed_img[0]) + '.jpg')) except urllib.error.HTTPError as err: print(err.code) ��

    Мы используем пул многопоточности, который создает пул рабочих процессов на основе максимального количества доступных ядер на вашем компьютере, а затем в основном подает задачи по мере освобождения ядер. (ссылка) У меня на Mac 4 ядра, поэтому я выберу 4, но это работало для меня, когда я использовал другие значения, поэтому это относительно произвольно.

    ��python pool = ThreadPool(processes=4) ��

    Здесь есть больше документации о многопоточности и пуле.

    ��python pool.map(download_breed_images, breed_list_new) pool.close() pool.join() ��

    У меня все прошло очень быстро, так как у нас было всего 5 кроликов. Теперь у меня есть каталоги внутри моего каталога rabbit_breeds, содержащие все названия пород кроликов, которых мы собрали. Вот один милый кролик, которого я получил в этом примере.

    ��`markdown

    ��`

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

    Я не смог бы сделать это без инструкций Аарона Шлегеля о том, как скачать 45 000 изображений усыновляемых кошек с помощью petpy. фотографий с Petfinder.