Парсинг картинок с pixabay.com (через API циклом Parallel.For)

denchik

Client
Регистрация
26.05.2017
Сообщения
50
Реакции
100
Баллы
33
Всем привет. Хочу представить свой шаблон по поиску изображений на бесплатном фотостоке pixabay.com.
- Лицензия https://pixabay.com позволяет использовать изображения как в
личных целях, так и в коммерческих, поэтому это абсолютно "белый" проект.
- Шаблон работает по api, что позволяет скачивать сотни изображений за
несколько десятков секунд без существенной нагрузки на компьютер.
- В шаблоне будет рассмотрено, как сделать замер времени, которые тратит
шаблон на выполнение (от старта до завершения).
- Будет рассказано о том, как десерелизовать ответ в формате json, чтобы
удобно использовать полученные данные (будет создан отдельный класс).
- В шаблоне предусмотрено сохранение полученных фото через цикл for и
Parallel.For.

Расскажу более подробно, что было сделано.
Для работы через api нужно изучить документацию на https://pixabay.com/api/docs/
После простой регистрации на этой же странице нужно сохранить свой API key.
Чтобы далее работать с ответом по api, необходимо его десерелизовать. Для этого будем использовать библиотеку Newtonsoft. Скачаем её на официальном сайте https://www.newtonsoft.com/json и добавим в References.
Чтобы удобно было работать с ответом от pixabay, создадим отдельный класс. Ускорить этот процесс поможет этот сервис http://json2csharp.com/ Вставляем в него пример ответа в формате json, в ответ от отдает класс, для работы с ответом.

В нашем случае это будет:
PHP:
Развернуть Свернуть Копировать
public class Hit
{
    public int previewHeight { get; set; }
    public int likes { get; set; }
    public int favorites { get; set; }
    public string tags { get; set; }
    public int webformatHeight { get; set; }
    public int views { get; set; }
    public int webformatWidth { get; set; }
    public int previewWidth { get; set; }
    public int comments { get; set; }
    public int downloads { get; set; }
    public string pageURL { get; set; }
    public string previewURL { get; set; }
    public string webformatURL { get; set; }
    public int imageWidth { get; set; }
    public int user_id { get; set; }
    public string user { get; set; }
    public string type { get; set; }
    public int id { get; set; }
    public string userImageURL { get; set; }
    public int imageHeight { get; set; }
}

public class PixabayObject
{
    public int totalHits { get; set; }
    public List<Hit> hits { get; set; }
    public int total { get; set; }
}
Добавим этот код в Общий код и пропишем директиву Using.

Теперь рассмотрим, как замерить время выполнения шаблона. Для этого вначале кода пишем:
PHP:
Развернуть Свернуть Копировать
int startUnixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; // Это будет время начала выполнения шаблона в Unixtime
В конце кода получаем текущее время и вычисляем разницу между временем старта:
PHP:
Развернуть Свернуть Копировать
int finishtUnixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; // Время конца выполнения шаблона в Unixtime
int resultTime = finishtUnixTime - startUnixTime; // Время, затраченное на выполнение в Unixtime
DateTime pDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(resultTime); // Конвертация unixTime в секунды
project.SendInfoToLog("Время выполнения: " +resultTime +" секунд");

Так как шаблон работает на api, то мы можем при сохранении результатов использовать не последовательный цикл for, более быстрый Parallel.For. Для этого добавим в Using строку
Код:
Развернуть Свернуть Копировать
using System.Threading.Tasks;

Теперь запишем вместо цикла for
PHP:
Развернуть Свернуть Копировать
for (int i =0; i < pixa.hits.Count; i++) {
    url = pixa.hits[i].webformatURL.ToString();
        project.SendInfoToLog("Сохранили изображение № " +i);
// Сохранение картинок
    ZennoPoster.HttpGet(url, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 30000, "", "", true, 3, new String[]{}, directory, true );
 //    END Сохранение картинок
};

цикл Parallel.For
PHP:
Развернуть Свернуть Копировать
Parallel.For (0, Convert.ToInt32(pixa.hits.Count), x => {

    url = pixa.hits[x].webformatURL.ToString();
// Сохранение картинок
    ZennoPoster.HttpGet(url, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 30000, "", "", true, 3, new String[]{}, directory, true );
 //    END Сохранение картинок
});

Как видите, различие не очень большое, но как это скажется на скорости работы? Вы можете протестировать на своем компьютере, у меня 200 картинок при цикле for сохраняются за 155 секунд. При цикле Parallel.For - за 27 секунд. Более, чем в 5 раз.

Однако, учтите, что цикл Parallel.For не подходит для работы через браузер, только через запросы.

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

Спасибо за внимание!
 
Номер конкурса шаблонов
  1. Первый конкурс шаблонов
Уровень сложности
Продвинутый
Категория
  1. Парсинг

Вложения

[ERROR 403] Your account needs approval for retrieving high resolution images: https://pixabay.com/api/docs/?request_full_access

Написал в качестве причины: Becose its stupid to have api access to low quality images. Не дали доступ)) Долгое время не догонял почему 400-600 пикселов картинки качаются хотя я явно ставлю больше. За шаблон спасибо.
 
У меня такая ошибка

Тип Время Сообщение
14:33:08 Компиляция кода проекта Ошибка в действии "CS0006" "Не удалось найти файл метаданных "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\ExternalAssemblies\\Newtonsoft.Json.dll"".
 
У меня такая ошибка

Тип Время Сообщение
14:33:08 Компиляция кода проекта Ошибка в действии "CS0006" "Не удалось найти файл метаданных "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\ExternalAssemblies\\Newtonsoft.Json.dll"".
Ошибка говорит сама за себя
Для этого будем использовать библиотеку Newtonsoft. Скачаем её на официальном сайте https://www.newtonsoft.com/json и добавим в References.
Скачать Newtonsoft.Json.dll и поместить по указанному в логе ошибки пути
 
  • Спасибо
Реакции: denchik
Привет!

Подскажите шаблон на данный момент рабочий, можно его использовать?
Спасибо!
 
Не могу разобраться, запускаю проект, пишет проект выполнен с ошибкой и дальше действия Start не идет(
Я добавил Newtonsoft.Json.dll - это то что нужно?
Скачал последнюю версию отсюда: https://github.com/JamesNK/Newtonsoft.Json/releases

И не понятно, куда будет шаблон сохранять изображения :(
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)