|
Болтовня Разговоры на любые темы (думайте, о чем пишите) |
27.12.2015, 17:54
|
#31
|
Бывалый
Регистрация: 26.04.2009
Адрес: Россия, Уфа
Сообщений: 680
Написано 182 полезных сообщений (для 406 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Сообщение от h1dd3n
C#
|
Добился я нужного функционала от своего парсера на C#. Спасибо иностранным коллегам на Stackoverflow.
Сейчас у меня такая проблема:
>При загрузке изображения, иногда может выдать ошибку, как реализовать повторную загрузку?
Я слышал что-то о Retry паттернах + Polly библиотека.
Что посоветуешь, если, конечно, разбираешься в этом?
|
(Offline)
|
|
27.12.2015, 18:12
|
#32
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Сообщение от Program23
Добился я нужного функционала от своего парсера на C#. Спасибо иностранным коллегам на Stackoverflow.
|
покажи...
Сейчас у меня такая проблема:
>При загрузке изображения, иногда может выдать ошибку, как реализовать повторную загрузку?
Я слышал что-то о Retry паттернах + Polly библиотека.
Что посоветуешь, если, конечно, разбираешься в этом?
|
var img = await DownloadImage("http://google.com/img.png");
while (img == null) {
await Task.Delay(1000); // ждем секунду, это вместо Thread.Sleep
img = DownloadImage("http://google.com/img.png");
}
File.WriteAllBytes("C:\\myimage.png", img);
public async Task<byte[]> DownloadImage(string url) {
byte[] img;
try {
using (var webClient = new WebClient()) {
img = await webClient.DownloadDataTaskAsync(url);
return img;
}
}
catch {
return null;
}
}
в цикл можно еще условие на кол-во попыток добавить и в WebClient вместо обычного catch - вставить конкретный тип исключения (если проблемы с сетью - то нужно картинку заново попробовать скачать, если сервер 404 вернул, то нет смысла дальше долбить его)
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.12.2015, 21:24
|
#33
|
Бывалый
Регистрация: 26.04.2009
Адрес: Россия, Уфа
Сообщений: 680
Написано 182 полезных сообщений (для 406 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Сообщение от h1dd3n
покажи...
|
1. Загружаем первую страницу (HtmlNode)
2. Определяем количество страниц в каталоге
3. Загружаем другие страницы (HtmlNode)
Теперь у нас есть коллекция страниц.
1. Загружаем нужные нам img nodes
2. Создаем tuple с URL изображения и новым WebClient instance
3. Загружаем изображение
public class ImageDownloader
{
public void DownloadImagesFromUrl(string url, string folderImagesPath)
{
var uri = new Uri(url + "/?per_page=50");
var pages = new List<HtmlNode> { LoadHtmlDocument(uri) };
pages.AddRange(LoadOtherPages(pages[0], url));
pages.SelectMany(p => p.SelectNodes("//a[@class='catalog__displayedItem__columnFotomainLnk']/img"))
.Select(node => Tuple.Create(new UriBuilder(uri.Scheme, uri.Host, uri.Port, node.Attributes["src"].Value).Uri, new WebClient()))
.AsParallel()
.ForAll(t => DownloadImage(folderImagesPath, t.Item1, t.Item2));
}
private static void DownloadImage(string folderImagesPath, Uri url, WebClient webClient)
{
try
{
webClient.DownloadFile(url, Path.Combine(folderImagesPath, Path.GetFileName(url.ToString())));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static IEnumerable<HtmlNode> LoadOtherPages(HtmlNode firstPage, string url)
{
return Enumerable.Range(1, DiscoverTotalPages(firstPage))
.AsParallel()
.Select(i => LoadHtmlDocument(new Uri(url + "/?per_page=50&page=" + i)));
}
private static int DiscoverTotalPages(HtmlNode documentNode)
{
var totalItemsDescription = documentNode.SelectNodes("//div[@class='catalogItemList__numsInWiev']").First().InnerText.Trim();
var totalItems = int.Parse(Regex.Match(totalItemsDescription, @"\d+$").ToString());
var totalPages = (int)Math.Ceiling(totalItems / 50d);
return totalPages;
}
private static HtmlNode LoadHtmlDocument(Uri uri)
{
var doc = new HtmlDocument();
var wc = new WebClient();
doc.LoadHtml(wc.DownloadString(uri));
var documentNode = doc.DocumentNode;
return documentNode;
}
}
Так используем функцию:
DownloadImagesFromUrl("http://www.onlinetrade.ru/catalogue/televizori-c181/", @"C:\temp\televizori-c181\images");
Спасибо!
|
(Offline)
|
|
27.12.2015, 22:00
|
#34
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Ок, но у тебя нету кода который страницы разделов выдергивает, ты их руками перебирвать будешь? (там больше 1000 разделов на самом деле).
+ все картинки товаров ты так не получишь, ты получишь только превьюшки 100х100 (по 1 на товар). Чтобы картинки товаров (полноразмерные + там их несколько на товар) получить тебе надо еще на каждый товар запрос сделать.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.12.2015, 21:43
|
#35
|
Бывалый
Регистрация: 26.04.2009
Адрес: Россия, Уфа
Сообщений: 680
Написано 182 полезных сообщений (для 406 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Сообщение от h1dd3n
Ок, но у тебя нету кода который страницы разделов выдергивает, ты их руками перебирвать будешь? (там больше 1000 разделов на самом деле).
+ все картинки товаров ты так не получишь, ты получишь только превьюшки 100х100 (по 1 на товар). Чтобы картинки товаров (полноразмерные + там их несколько на товар) получить тебе надо еще на каждый товар запрос сделать.
|
Мне нужны именно эти превьюшки.
А ссылки я выдернул со страницы onlinetrade/catalogue по тому же алгоритму, только искал href. Все сохранилось в txt файл.
|
(Offline)
|
|
30.12.2015, 18:11
|
#36
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Сообщение от Program23
Мне нужны именно эти превьюшки.
А ссылки я выдернул со страницы onlinetrade/catalogue по тому же алгоритму, только искал href. Все сохранилось в txt файл.
|
В итоге сколько таких ссылок ?
__________________
|
(Offline)
|
|
30.12.2015, 20:23
|
#37
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Как загрузить все изображения с веб-сайта?
Шарписты - Маяковские. Столько буков и так мало толку.
Сообщение от Program23
Но после запуска твоего кода, у меня вылетают предупреждения, связанные с Curl.
Вложение 22171
|
Сообщение от Program23
связанные с Curl.
|
Где там CURL? Ты читать ошибку пробовал?
1) Warning при fopen
2) Warning при передаче хендла открытого файла в curl
Зачинщик именно файл. Curl тут ни при чём.
И да, я писал код "прямо тут", не тестил.
Если хочешь помочь голодному, не давай ему рыбы, дай ему удочку.
|
Похоже тебе всё же нужна изи-рыба.
Сообщение от Program23
Javascript, Php
|
Обманул же. Не знаешь ты php ни разу. И даже не пытаешься узнать.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:39.
|