Страница: 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.
Ответить
|
Номер ответа: 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?
Ответить
|
Номер ответа: 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 (для асинхронной загрузки, чтоб основной поток не тормозил), или запускай загрузку в отдельном потоке.
Ответить
|
Страница: 1 |
Поиск по форуму