Парсинг картинок с 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 не подходит для работы через браузер, только через запросы.

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

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

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

seodamage

Client
Регистрация
08.09.2014
Сообщения
191
Благодарностей
52
Баллы
28
[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 пикселов картинки качаются хотя я явно ставлю больше. За шаблон спасибо.
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 179
Благодарностей
74
Баллы
48
У меня такая ошибка

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

Nord

Client
Регистрация
22.03.2012
Сообщения
2 358
Благодарностей
1 419
Баллы
113
У меня такая ошибка

Тип Время Сообщение
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

yura005

Client
Регистрация
19.02.2016
Сообщения
60
Благодарностей
0
Баллы
6
Привет!

Подскажите шаблон на данный момент рабочий, можно его использовать?
Спасибо!
 

yura005

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

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

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