На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Парсинг с CsQuery: время ожидания операции истекло


В предыдущей статье я показал вам, как можно получать информацию с сайтов при помощи CsQuery. Вроде бы все прекрасно. Собрали с одной страницы адреса других страниц (организаций, товаров – смотря что мы там парсим); записали их в файл; прочитали его; создали цикл и ждем завершения. Однако, не все так просто, нередко возникают ошибки. В данной заметке мы разберем такую как «время ожидания операции истекло».

Простой код:

  string[] adresa = new string[3000];
            int chett = -1;
            using (StreamReader fs = new StreamReader(@"mingkh.txt"))
            {
                while (true)
                {
                    chett++;
                    string temp = fs.ReadLine();
                    if (temp == null) break;
                    else adresa[chett] = temp;
                }
            }

            for (int i = 0; i < chett; i++)
            {
                CQ dom = CQ.CreateFromUrl(adresa[i]);

                foreach (IDomObject obj in dom.Find("dd"))
                {
                    if (obj.TextContent != "")
                    {
                        textBox1.Text += obj.TextContent;
                    }
                }
            }
Запускаем его для одного-двух адресов, убеждаемся, что все в порядке; пробуем запустить для тысячи и через минуту видим вот такую ошибку:

Время ожидания операции истекло

Время ожидания операции истекло. Что это значит? А это буквально тоже и значит: наша программа подождала-подождала ответ сервера, не получила его и выпала с ошибкой. Можно обработать ошибку, но это не очень хорошо, так как нам все же нужны все данные, а не с пропусками. Что делать?

Создавать свой класс WebClient, в котором уже задавать свой таймаут. К примеру, минут на 20:

 private class MyWebClient : WebClient
        {
            protected override WebRequest GetWebRequest(Uri uri)
            {
                WebRequest w = base.GetWebRequest(uri);
                w.Timeout = 20 * 60 * 1000;
                return w;
            }
        }
Используем же его так:
for (int i = 0; i < chett; i++)
            {
                using (MyWebClient client = new MyWebClient())
                {
                    client.Encoding = Encoding.UTF8;
                    string htmlCode = client.DownloadString(adresa[i]);
                    CQ dom = CQ.Create(htmlCode, Encoding.UTF8);
                    foreach (IDomObject obj in dom.Find("dd"))
                    {
                        textBox1.Text += obj.TextContent+ System.Environment.NewLine;
                    }
                }
            }
Обратите внимание, что если кодировка сайта-донора отличается от Windows-1251, то необходимо указывать её самостоятельно. В нашем случае это UTF8. Запускаем код и видим, что все прекрасно работает:



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




тегизаметки, CsQuery, си шарп, парсинг, парсинг сайтов

Читайте также:




Урок 16. Конвертация строк в числа на C#
Создание анимации в Unity3d на C#


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.