Парсинг картинок на C#

127
13 декабря 2019, 11:10

Есть небольшая проблема. При парсинге картинок, долго подгружаются изображения в PictureBox(разрешение 140х215, было бы чему грузится). Иногда быстро грузит, от чего зависит не знаю. Есть ли возможность подгружать их быстрее? Или же сохранять в кэш и после распределять по PictureBox'ам.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HtmlAgilityPack;
using HtmlDocument = HtmlAgilityPack.HtmlDocument;
namespace ivi
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            GetHtmlAsync();
        }
        private async void GetHtmlAsync()
        {
            //Boxes
            PictureBox[] boxes = {
  pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, pictureBox7, pictureBox8, pictureBox9, pictureBox10};
            Label[] labels = {
                label1, label2, label3, label4, label5, label6, label7, label8, label9, label10};
            //Parse
            var url = "https://www.ivi.ru/movies/horror";
            var httpClient = new HttpClient();
            var html = await httpClient.GetStringAsync(url);
            var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(html);
            var ProductHtml = htmlDocument.DocumentNode.Descendants("ul")
                .Where(node => node.GetAttributeValue("class", "")
                .Equals("gallery posters-small mobile-has-titles js-criteo-gallery")).ToList();
            var ProductlistItems = ProductHtml[0].Descendants("li")
                .Where(node => node.GetAttributeValue("class", "")
                .Contains("poster")).ToList();
            int i = 0;
            //Список
            foreach (var ProducListItem in ProductlistItems)
            {
                //Название фильма
                var namefilm = ProducListItem.Descendants("span")
                    .Where(node => node.GetAttributeValue("class", "")
                    .Equals("name")).FirstOrDefault().InnerText.Trim();
                //Картинка фильма
                var picturefilm = ProducListItem.Descendants("img").FirstOrDefault().GetAttributeValue("src", "");
                //Logs
                LogText.Text += namefilm + '\r' + '\n';  
                LogText.Text += picturefilm + '\r' + '\n';
                boxes[i].SizeMode = PictureBoxSizeMode.StretchImage;
                boxes[i].ImageLocation = picturefilm;
                labels[i].Text = namefilm;
                i++;
                if (i == 9)
                    break;
            }
        }
    }
}

Answer 1

Не факт. Картинка весит в среднем по 12 КБ..подгружаю максимум 10 картинок. Не думаю, что сервак 120 Кбайт долго подгрузит.

Вопрос не в весе картинки, а в пинге сервера. Если по какой-то причине задержка на запрос увеличивается, то и 12 КБ будет долго качатся. Точнее качатся будет достаточно быстро, а вот начинать скачивание - долго.

Тебе нужно делать не последовательно запросы а в паралели. Это решит проблему скорости подгрузки. Открой для себя многопоточность и будет тебе счастье :)

READ ALSO
Общая строка для двух RegEx

Общая строка для двух RegEx

Существует ли способ определить факт существования строки, удовлетворяющий двум regex в реальном времениНапример для

149
C# toast notification console application

C# toast notification console application

Взял пример консольное приложение для вывода уведомлений Windows 10Уведомления показываются, но не остаются в центре уведомлений, как допустим...

147
Переменное число входных переменных в C#

Переменное число входных переменных в C#

Сегодня ходил на собеседование, и одним из вопросов был:

95