Всем привет. Хочу представить свой шаблон по поиску изображений на бесплатном фотостоке pixabay.com.
Расскажу более подробно, что было сделано.
Для работы через api нужно изучить документацию на https://pixabay.com/api/docs/
После простой регистрации на этой же странице нужно сохранить свой API key.
Чтобы далее работать с ответом по api, необходимо его десерелизовать. Для этого будем использовать библиотеку Newtonsoft. Скачаем её на официальном сайте https://www.newtonsoft.com/json и добавим в References.
Чтобы удобно было работать с ответом от pixabay, создадим отдельный класс. Ускорить этот процесс поможет этот сервис http://json2csharp.com/ Вставляем в него пример ответа в формате json, в ответ от отдает класс, для работы с ответом.
В нашем случае это будет:
Добавим этот код в Общий код и пропишем директиву Using.
Теперь рассмотрим, как замерить время выполнения шаблона. Для этого вначале кода пишем:
В конце кода получаем текущее время и вычисляем разницу между временем старта:
Так как шаблон работает на api, то мы можем при сохранении результатов использовать не последовательный цикл for, более быстрый Parallel.For. Для этого добавим в Using строку
Теперь запишем вместо цикла for
цикл Parallel.For
Как видите, различие не очень большое, но как это скажется на скорости работы? Вы можете протестировать на своем компьютере, у меня 200 картинок при цикле for сохраняются за 155 секунд. При цикле Parallel.For - за 27 секунд. Более, чем в 5 раз.
Однако, учтите, что цикл Parallel.For не подходит для работы через браузер, только через запросы.
В дальнейшем, планирую реализовать этот шаблон в виде отдельной библиотеки, чтобы более просто использовать его в других шаблонах, где требуются бесплатные изображения в хорошем качестве.
Спасибо за внимание!
- Лицензия https://pixabay.com позволяет использовать изображения как в
личных целях, так и в коммерческих, поэтому это абсолютно "белый" проект.
- Шаблон работает по api, что позволяет скачивать сотни изображений за
несколько десятков секунд без существенной нагрузки на компьютер.
- В шаблоне будет рассмотрено, как сделать замер времени, которые тратит
шаблон на выполнение (от старта до завершения).
- Будет рассказано о том, как десерелизовать ответ в формате json, чтобы
удобно использовать полученные данные (будет создан отдельный класс).
- В шаблоне предусмотрено сохранение полученных фото через цикл for и
Parallel.For.
личных целях, так и в коммерческих, поэтому это абсолютно "белый" проект.
- Шаблон работает по 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; }
}
Теперь рассмотрим, как замерить время выполнения шаблона. Для этого вначале кода пишем:
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 не подходит для работы через браузер, только через запросы.
В дальнейшем, планирую реализовать этот шаблон в виде отдельной библиотеки, чтобы более просто использовать его в других шаблонах, где требуются бесплатные изображения в хорошем качестве.
Спасибо за внимание!
- Номер конкурса шаблонов
- Первый конкурс шаблонов
- Уровень сложности
- Продвинутый
- Категория
- Парсинг




