Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 19.07.2012, 20:23   #21
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
Репутация: 76
По умолчанию

вот еще пример с бекгроунд воркером.. чтоб было понятней почему так... dowork работает в другом потоке... ProgressChanged в том же

Код:
    private void button1_Click(object sender, EventArgs e)
        {
            var t = new BackgroundWorker();
            t.DoWork += DoWork;
            t.WorkerReportsProgress = true;
            t.ProgressChanged += ProgressChanged;
            t.RunWorkerAsync();
        }

        public EventWaitHandle h=new EventWaitHandle(false,EventResetMode.ManualReset);

        private bool ajaxloaded;
        private void ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

            
            if (test)// add your ajax test here
            {
                //docg.LoadHtml(webBrowser1.DocumentText);
                ajaxloaded = true;
            }
            
            h.Set();
            
        }

        private void DoWork(object sender, DoWorkEventArgs e)
        {
            while (!ajaxloaded)
            {
// нельзя обратиться здесь
                Thread.Sleep(1000);
                (sender as BackgroundWorker).ReportProgress(1);
                h.WaitOne();
            }
           
        }
Reskov вне форума   Ответить с цитированием
Старый 19.07.2012, 20:23   #22
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
Репутация: 10
По умолчанию

Цитата:
это тоже не понятно зачем
Код:
webBrowser1.Navigate("http://ru.savefrom.net/"+textBox1.Text);
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }
Это ожидание полной загрузки страницы ( как оказалось не воспринимает выполнение ajax скриптов)

Сейчас попробую Invoke, правда не совсем понял неопходом в этом случае theade или можно все прописать в обще потоке используя invoke и при этом сраница загрузится как надо?
SnaiperArts вне форума   Ответить с цитированием
Старый 19.07.2012, 20:31   #23
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
Репутация: 76
По умолчанию

thread нужен чтобы не подвисал главный поток во время ожидания.. нам как-то надо просигнализуровать главному потоку что можно работать дальше, в предыдущем посте я привел примерную реализацию через бекгроунд воркер она скорей просто для ознакомления, лучше использовать именно thread и создавать webbrowser тоже в нем...
Reskov вне форума   Ответить с цитированием
Старый 19.07.2012, 20:32   #24
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
Репутация: 10
По умолчанию

Reskov, если честно совсем запутался. Я не силен в этом всем.
Помогите пожалуйста получить код страницы с выполненным скриптом, чтобы получить прямую ссылку с нее

Вот так выглядит ссылка на запрос(без символа "_") _http://ru.savefrom.net/#url=http://narod.ru/disk/359767001/421329.zip.html
Он выдает прямую ссылку на файл...

Что я совсем запутался во всем этом... Помогите составить код если не сложно Вам.
SnaiperArts вне форума   Ответить с цитированием
Старый 19.07.2012, 23:32   #25
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
Репутация: 76
По умолчанию

немножко коряво но у меня работает. на форме должна быть кнопка и текст бокс

Код:
        private void button1_Click(object sender, EventArgs e)
        {
            var t = new Thread(
                () =>
                    {
                        var webBrowser1 = new WebBrowser();
                        webBrowser1.Navigate(
                            "http://ru.savefrom.net/#url=http://narod.ru/disk/359767001/421329.zip.html");
                        int tick = 0;
                        while (tick<20000)
                        {
                            Thread.Sleep(100);
                            tick += 100;
                            Application.DoEvents();
                        }
                        var inputs = webBrowser1.Document.GetElementsByTagName("input");
                        textBox1.Invoke(new Action(() => { textBox1.Text += inputs[1].GetAttribute("value"); }));
                    });
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        }

Последний раз редактировалось Reskov; 19.07.2012 в 23:41.
Reskov вне форума   Ответить с цитированием
Старый 20.07.2012, 00:00   #26
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
Репутация: 76
По умолчанию

вот еще примерчик с бэкгроундворкером. пс надо локи поставить теоритически может выдать ссылку несколько раз

Код:
        WebBrowser webBrowser1 = new WebBrowser();

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(
                "http://ru.savefrom.net/#url=http://narod.ru/disk/359767001/421329.zip.html");
 
            var t = new BackgroundWorker();
            t.DoWork += DoWork;
            t.WorkerReportsProgress = true;
            t.ProgressChanged += ProgressChanged;
            t.RunWorkerAsync();
        }

        private bool ajaxloaded;
        private void ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (webBrowser1.Document!=null)
            {
                var inputs = webBrowser1.Document.GetElementsByTagName("input");

                if (inputs.Count > 1 && !string.IsNullOrEmpty(inputs[1].GetAttribute("value")))
                {
                    ajaxloaded = true;
                    textBox1.Text += inputs[1].GetAttribute("value");

                }
            }
               

        }

        private void DoWork(object sender, DoWorkEventArgs e)
        {
            while (!ajaxloaded )
            {
                (sender as BackgroundWorker).ReportProgress(1);
                Thread.Sleep(1000);
            }
        }
Reskov вне форума   Ответить с цитированием
Старый 20.07.2012, 17:18   #27
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
Репутация: 10
По умолчанию

Reskov, Огромное спасибо за решение моих проблем!!! Выручили очень сильно!

Использовал первый код, т.к. для меня он более понятен, хоть и коряв)) Второй пока осмыслить что там творится не хватает знаний(( Поверьте опыт программирования всего неделя, а уже куря манулы научился работать с базами данных, работать со стронними библиотека и сейчас вникаю в потоки... Хотя знания очень скудные, из-за чего туплю в некоторых моментах... И полагаю все таки надо почитать книги, правда попадаются очень скучные и нудные, на которые не хватает терпения...

Еще раз спасибо за решение проблем!

Ps тему пока не закрывайте) т.к. с толкнулся еще с рядом проблем, которые надеюсь решить самостоятельно...
SnaiperArts вне форума   Ответить с цитированием
Старый 20.07.2012, 20:26   #28
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
Репутация: 10
По умолчанию

Не долго я ликовал(( Вообщем странная ошибка происходит на определенных страницах.

После остановки программы ошибка показывает на слово foreach с пометкой "Ссылка на объект не указывает на экземпляр объекта." При чем если в xPath сменить на
//font[@size='2']

т.е. выдрать все font, выдает кучу текста(на всех страницах очень много тегов font). На другой же части страниц работает нормально

Код:
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//font[@size='2'][2]"); //  выбираю содержимое внутри второго font

            if (doc != null)
            {
                
                foreach (HtmlNode node in nodes) // ОШИБКА С пометкой Ссылка на объект не указывает на экземпляр объекта.
                {
                   
                   
                   if (node.InnerText.Trim().Replace("&nbsp;", "") != "" )// небольшая проверка на пустые строки и удаление мусора
                   {
                       richTextBox1.Text = richTextBox1.Text + node.InnerText.Trim().Replace("&nbsp;", "") + "<br/>";
                   }
                  
               }
В чем тут исключительная ситуация такая?

Последний раз редактировалось SnaiperArts; 20.07.2012 в 20:31.
SnaiperArts вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсинг сайта Jadson Работа с сетью в Delphi 0 14.05.2012 23:30
Парсинг ссылок сайта demiancz Общие вопросы Delphi 9 27.02.2012 01:00
парсинг сайта на bash Backo Помощь студентам 2 15.09.2011 17:24
парсинг сайта CodeNOT PHP 1 21.03.2011 10:48
Парсинг сайта AnToHa-KiLL Общие вопросы Delphi 3 30.06.2009 08:22


13:31.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru