forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Болтовня (http://forum.boolean.name/forumdisplay.php?f=25)
-   -   Как загрузить все изображения с веб-сайта? (http://forum.boolean.name/showthread.php?t=20132)

Program23 27.12.2015 17:54

Ответ: Как загрузить все изображения с веб-сайта?
 
Цитата:

Сообщение от h1dd3n (Сообщение 302769)
C#

Добился я нужного функционала от своего парсера на C#. Спасибо иностранным коллегам на Stackoverflow.

Сейчас у меня такая проблема:
>При загрузке изображения, иногда может выдать ошибку, как реализовать повторную загрузку?
Я слышал что-то о Retry паттернах + Polly библиотека.
Что посоветуешь, если, конечно, разбираешься в этом?

h1dd3n 27.12.2015 18:12

Ответ: Как загрузить все изображения с веб-сайта?
 
Цитата:

Сообщение от Program23 (Сообщение 302957)
Добился я нужного функционала от своего парсера на 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 вернул, то нет смысла дальше долбить его)

Program23 27.12.2015 21:24

Ответ: Как загрузить все изображения с веб-сайта?
 
Цитата:

Сообщение от h1dd3n (Сообщение 302958)
покажи...

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");
Спасибо!

h1dd3n 27.12.2015 22:00

Ответ: Как загрузить все изображения с веб-сайта?
 
Ок, но у тебя нету кода который страницы разделов выдергивает, ты их руками перебирвать будешь? (там больше 1000 разделов на самом деле).

+ все картинки товаров ты так не получишь, ты получишь только превьюшки 100х100 (по 1 на товар). Чтобы картинки товаров (полноразмерные + там их несколько на товар) получить тебе надо еще на каждый товар запрос сделать.

Program23 29.12.2015 21:43

Ответ: Как загрузить все изображения с веб-сайта?
 
Цитата:

Сообщение от h1dd3n (Сообщение 302964)
Ок, но у тебя нету кода который страницы разделов выдергивает, ты их руками перебирвать будешь? (там больше 1000 разделов на самом деле).

+ все картинки товаров ты так не получишь, ты получишь только превьюшки 100х100 (по 1 на товар). Чтобы картинки товаров (полноразмерные + там их несколько на товар) получить тебе надо еще на каждый товар запрос сделать.

Мне нужны именно эти превьюшки.
А ссылки я выдернул со страницы onlinetrade/catalogue по тому же алгоритму, только искал href. Все сохранилось в txt файл.

h1dd3n 30.12.2015 18:11

Ответ: Как загрузить все изображения с веб-сайта?
 
Цитата:

Сообщение от Program23 (Сообщение 303007)
Мне нужны именно эти превьюшки.
А ссылки я выдернул со страницы onlinetrade/catalogue по тому же алгоритму, только искал href. Все сохранилось в txt файл.

В итоге сколько таких ссылок ?

Randomize 30.12.2015 20:23

Ответ: Как загрузить все изображения с веб-сайта?
 
Шарписты - Маяковские. Столько буков и так мало толку.
Цитата:

Сообщение от Program23 (Сообщение 302853)
Но после запуска твоего кода, у меня вылетают предупреждения, связанные с Curl.
Вложение 22171

Цитата:

Сообщение от Program23 (Сообщение 302853)
связанные с Curl.

Где там CURL? Ты читать ошибку пробовал?
1) Warning при fopen
2) Warning при передаче хендла открытого файла в curl
Зачинщик именно файл. Curl тут ни при чём.
И да, я писал код "прямо тут", не тестил.
Цитата:

Если хочешь помочь голодному, не давай ему рыбы, дай ему удочку.
Похоже тебе всё же нужна изи-рыба.

Цитата:

Сообщение от Program23 (Сообщение 302771)
Javascript, Php

Обманул же. Не знаешь ты php ни разу. И даже не пытаешься узнать.


Часовой пояс GMT +4, время: 03:59.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot