Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Помогите разобраться с WebBrowser в VB.NET Добавлено: 21.05.09 19:38  

Автор вопроса:  CPOnix
Использую VB.NET 2008

Задача - отпарсить N web-страниц с сайта.
Что делаю для этого:

1) Предварительно в папке temp созданы N файлов вида 1.url, 2.url, ..., N.url, содержащие URL страниц.

2) Гружу и сохраняю страницы в файлы 1.dat, 2.dat, ..., N.dat в той же папке, что и ссылки.

Проблема следующая:
Допустим у меня N=35. Так вот 35 раз сохраняется одна и та же первая страница. До загрузки второй даже не доходит. А хотелось бы...
Таймер работает вроде бы, так как иногда страница сразу не грузится, и он вызывает повтор загрузки.
Очень нужно сохранить последовательно их все!

Помогите разобраться, пожалуйста.

Ниже приведен код сего творчества...

--------------------------------------

Обработчик нажатия кнопки запуска загрузчика:

Private Sub BLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BLoad.Click

path = My.Computer.FileSystem.CurrentDirectory _
+ "\status\members.dat"
FileOut = My.Computer.FileSystem.ReadAllText(path)
MembersCount = Val(FileOut)
PreLoadData()
Timer1.Interval = 20000
Timer1.Enabled = True
currentCharID = 1
LoadData()

End Sub


Из файла status\members.dat извлекаем количество страниц.
PreLoadData подготавливает файлы с URL.
Настраиваем таймер, организующий таймаут загрузки страницы для попытки загрузить повторно.
Устанавливаем номер страницы 1 для загрузки и запускаем процедуру LoadData.

--------------------------------------

Private Sub LoadData()

path = My.Computer.FileSystem.CurrentDirectory _
+ "\temp\" + LTrim(Str(currentCharID)) + ".url"
FileOut = My.Computer.FileSystem.ReadAllText(path)
Timer1.Start()
WebBrowser.Stop()
WebBrowser.Navigate(FileOut)

End Sub


Процедура загрузки читает URL текущей страницы из файла, запускает таймер таймаута веб-браузера, останавливает загрузку, если она шла, вызывает загрузку страницы.

--------------------------------------

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Timer1.Stop()
LoadData()

End Sub


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

--------------------------------------

Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser.DocumentCompleted

Timer1.Stop()
path = My.Computer.FileSystem.CurrentDirectory _
+ "\temp\" + LTrim(Str(currentCharID)) + ".dat"

My.Computer.FileSystem.WriteAllText(path, _
WebBrowser.DocumentText, True)

If currentCharID < MembersCount Then
   currentCharID = currentCharID + 1
   LoadData()
Else
   Timer1.Enabled = False
End If

End Sub


По завершению загрузки страницы останавливаем таймер таймаута браузера. Пишем текст загруженной страницы в файл 1.dat, 2.dat, ..., N.dat
Если есть ещё страницы для загрузки - запускаем снова процедуру LoadData.

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 21.05.09 22:28
Зачем тебе WebBrowser? В .NET есть класс WebClient который позволяет выполнить HTTP-запрос буквально одной строчкой кода

Ответить

Номер ответа: 2
Автор ответа:
 CPOnix



Вопросов: 1
Ответов: 4
 Профиль | | #2 Добавлено: 22.05.09 05:50
А с WebClient-ом также можно реализовать таймаут?

Просто мне интересно почему DocumentComplete срабатывает много раз, хоть на странице и нет фреймов.
DocumentComplete иногда срабатывает с неполностью загруженной страницей, отследить можно только проверив наличие закрывающегося тега </HTML> в конце...

С WebClient такого не будет?

Ответить

Номер ответа: 3
Автор ответа:
 CPOnix



Вопросов: 1
Ответов: 4
 Профиль | | #3 Добавлено: 22.05.09 06:03
И сопутствующий вопрос.

Положим в коде я использую интеграцию VB.NET и PHP. Мне больше нравятся средства PHP для парсинга.

Shell = CreateObject("WScript.Shell";)
Shell.Run(My.Computer.FileSystem.CurrentDirectory + _
"\php\php.exe -c .\php\php.ini -f .\parser\parse_info.php " + Str(i), 0, 1)
Shell = Nothing


Т.е. я в командную строку отправляю запрос с аргументом Str(i) (номером страницы для парсинга) выполнить PHP скрипт.

Вопрос: если PHP по каким-то причинам выдаст ошибку, что не видно пользователю, либо будет достигнут таймаут выполнения скрипта (что есть в php.ini), будет ли программа на VB.NET ожидать всё это время, прежде чем отработать следующую команду процедуры?
Как заменить WScript.Shell средствами .NET?

Ответить

Номер ответа: 4
Автор ответа:
 CPOnix



Вопросов: 1
Ответов: 4
 Профиль | | #4 Добавлено: 22.05.09 06:38
  1.     Private Sub LoadArmoryData()
  2.         TBStatus.Text = "Загрузка страницы: " + Str(currentCharID) + " из " + Str(MembersCount)
  3.         path = My.Computer.FileSystem.CurrentDirectory + "\temp\" + LTrim(Str(currentCharID)) + ".url"
  4.         FileOut = My.Computer.FileSystem.ReadAllText(path)
  5.         Try
  6.             Dim WC As System.Net.WebClient = New System.Net.WebClient
  7.             Dim response As System.IO.Stream = WC.OpenRead(FileOut)
  8.             Dim streamReader As New System.IO.StreamReader(response)
  9.             Dim out As String = streamReader.ReadToEnd()
  10.             streamReader.Close()
  11.             path = My.Computer.FileSystem.CurrentDirectory + "\temp\" + LTrim(Str(currentCharID)) + ".dat"
  12.             My.Computer.FileSystem.WriteAllText(path, out, True)
  13.             currentCharID = currentCharID + 1
  14.             If currentCharID <= MembersCount Then
  15.                 LoadData()
  16.             End If
  17.         Catch ex As Exception
  18.             LoadData()
  19.         End Try
  20.     End Sub


Только вот программа повисает на время загрузки. Но всё грузится - уже результат.
Как-нибудь бы сделать так, чтобы элементы формы не исчезали и с формой можно было работать во время загрузки...

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 22.05.09 18:14
CPOnix пишет:
А с WebClient-ом также можно реализовать таймаут?

Можно

CPOnix пишет:
Просто мне интересно почему DocumentComplete срабатывает много раз, хоть на странице и нет фреймов.
DocumentComplete иногда срабатывает с неполностью загруженной страницей, отследить можно только проверив наличие закрывающегося тега </HTML> в конце...

Возможно потому что ты несколько раз подряд вызываешь navigate не дожидаясь загрузки предыдущей страницы.

CPOnix пишет:
С WebClient такого не будет?

Не будет

CPOnix пишет:


Т.е. я в командную строку отправляю запрос с аргументом Str(i) (номером страницы для парсинга) выполнить PHP скрипт.

Вопрос: если PHP по каким-то причинам выдаст ошибку, что не видно пользователю, либо будет достигнут таймаут выполнения скрипта (что есть в php.ini), будет ли программа на VB.NET ожидать всё это время, прежде чем отработать следующую команду процедуры?
Как заменить WScript.Shell средствами .NET?

System.Diagnostics.Process.Start
Можно указать что прогармма должна дождаться завершения выполнения скрипта.

CPOnix пишет:
Только вот программа повисает на время загрузки. Но всё грузится - уже результат.
Как-нибудь бы сделать так, чтобы элементы формы не исчезали и с формой можно было работать во время загрузки...

Используй WebClient.DownloadFile, WebClient.DownloadFileAsync (для асинхронной загрузки, чтоб основной поток не тормозил), или запускай загрузку в отдельном потоке.

Ответить

Номер ответа: 6
Автор ответа:
 CPOnix



Вопросов: 1
Ответов: 4
 Профиль | | #6 Добавлено: 22.05.09 20:13
Спасибо, учту

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам