1 (изменено: Dizzy221, 2014-11-20 21:31:55)

Тема: VBS: Поиск по странице

Подскажите, в какую сторону копать?
VBS скрипт через IE щелкает странички. Надо осуществить поиск определенного слова на одной из страниц. Как это реализовать?

Пишу на PHP+MySQL за еду
----
ICQ: 424812203

2

Re: VBS: Поиск по странице

Через DOM. Поскольку Вы не указали ни URL искомой страницы, ни искомое слово, ничего конкретнее изложенного сказать нельзя.

3 (изменено: Dizzy221, 2014-11-20 22:17:36)

Re: VBS: Поиск по странице

alexii пишет:

Через DOM. Поскольку Вы не указали ни URL искомой страницы, ни искомое слово, ничего конкретнее изложенного сказать нельзя.

Спасибо за подсказку. Вот что сделал, получаю html код со страницы, заношу его в text, затем проверяю на наличие символа/строки:

Set objIE = CreateObject("InternetExplorer.Application")
Dim text, result, word
objIE.Visible = False
objIE.Navigate "http://адрес.ру"
While objIE.Busy
    WScript.Sleep 200
Wend
Set tag = objIE.Document.documentElement
text = tag.innerHTML
word = "1"
result=InStr(word,text)

MsgBox "Мы нашли слово " & word &" и нашли его " & result & " раз"

Но несмотря на это всегда получаю результат 0, в чем ошибка?

Пишу на PHP+MySQL за еду
----
ICQ: 424812203

4

Re: VBS: Поиск по странице

в чем ошибка?

Ваша ошибка в том, что Вы по-прежнему умалчиваете о:

Вы не указали ни URL искомой страницы, ни искомое слово

Гадать о сферическом коне в вакууме не вижу смысла.

5 (изменено: Dizzy221, 2014-11-21 03:15:23)

Re: VBS: Поиск по странице

Вы не указали ни URL искомой страницы, ни искомое слово
Гадать о сферическом коне в вакууме не вижу смысла.

Хорошо, url http://forum.script-coding.com/
Искомое слово "форум", но прежнему безрезультатно...

Пишу на PHP+MySQL за еду
----
ICQ: 424812203

6

Re: VBS: Поиск по странице

Dizzy221 пишет:

Хорошо, url http://forum.script-coding.com/
Искомое слово "форум", но прежнему безрезультатно...

Отнюдь.

+ открыть спойлер
Option Explicit

Const READYSTATE_COMPLETE = 4


Dim strUrl
Dim strWord

Dim objIE


strUrl = "http://forum.script-coding.com/"
strWord = "форум"

With WScript.CreateObject("InternetExplorer.Application")
    .Visible = False
    .Navigate strUrl
    
    Do 
        WScript.Sleep 100
    Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
    
    If InStr(1, .Document.Body.innerText, strWord, vbTextCompare) > 0 Then
        WScript.Echo "Text [" & strWord & "] found on Url [" & strUrl & "]."
    Else
        WScript.Echo "Text [" & strWord & "] not found on Url [" & strUrl & "]."
    End If
    
    .Quit
End With

WScript.Quit 0

Результат:

Text [форум] found on Url [http://forum.script-coding.com/].

Теперь по поводу Вашего кода выше.

  • Кроме свойства «.Busy» надо проверять и состояние свойства «.ReadyState». И иногда (в случае пользования Ajax) — не один раз.

  • Не вижу необходимости брать свойство «.documentElement». Разве что Вас интересует мета-информация, скрипты и т.п.

  • К чему Вы берёте свойство «.innerHTML», а не «.innerText» мне также не понятно. Речь вроде бы шла про поиск текста на странице.

  • Функция «Instr()» работает не так, как Вы предполагаете: она возвращает не число вхождений подстроки, а позицию подстроки, если та найдена. К тому же, если первый необязательный параметр (с какого символа начинать поиск) опущен — поиск идёт двоичный (ибо в этом случае третий параметр тоже опускается) и потому — регистрозависимый. Например, если Вы попробуете поискать слово "серый", то «InStr(1, .Document.Body.innerText, strWord, vbTextCompare) > 0» его найдёт, а вот «InStr(.Document.Body.innerText, strWord) > 0» — нет, поскольку слово «"серый"» встречается там только с заглавной буквы — «"Серый"».

7

Re: VBS: Поиск по странице

Благодарю за подробный ответ

Пишу на PHP+MySQL за еду
----
ICQ: 424812203

8

Re: VBS: Поиск по странице

Ну, как — теперь получилось?

9

Re: VBS: Поиск по странице

Подскажите пожалуйста, как вместо

WScript.Echo "Text [" & strWord & "] found on Url [" & strUrl & "]."

Просто произвести .click на ту найденную ссылку?

10

Re: VBS: Поиск по странице

cyber54245 пишет:

... Просто произвести .click на ту найденную ссылку?

Если имеется в виду, что нужно кликнуть ссылку, текст которой содержит искомое слово, то потребуется в цикле перебрать все ссылки на странице (тэги <a> DOM), и, у каждой проверяя вхождение искомого слова в содержимое её текстого узла, дойти до нужной и применить метод .click():

sSample = "Главная"
For Each oTag in oIE.Document.GetElementsByTagName("a")
    If Instr(1, oTag.innertext, sSample, vbTextCompare) > 0 Then
        oTag.Click
        Exit For
    End If
Next
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

11

Re: VBS: Поиск по странице

Этот вариант я и пробовал. Но как сделать, чтобы действие click повторялось несколько раз подряд с разными WScript.Sleep между click.

12

Re: VBS: Поиск по странице

cyber54245 пишет:

Этот вариант я и пробовал. Но как сделать, чтобы действие click повторялось несколько раз подряд с разными WScript.Sleep между click.


sSample = "Главная"
For Each oTag in oIE.Document.GetElementsByTagName("a")
    If Instr(1, oTag.InnerText, sSample, vbTextCompare) > 0 Then
        oTag.Click
        Do While Rnd < .9
            WScript.Sleep 100 + Rnd * 2000
            oTag.Click
        Loop        
        Exit For
    End If
Next
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

13 (изменено: cyber54245, 2015-01-19 03:26:34)

Re: VBS: Поиск по странице

Огромное спасибо, похоже это наилучший вариант. Но, получаю ошибку.
Сайт открывает нормально, по первой ссылке переходит без проблем, а вот при втором переходе получаю ошибку (Разрешение отклонено: 'Click', 800A0046):
http://clip2net.com/clip/m226184/68d0d-clip-20kb.jpg

Вот такой вариант кода использую:

Dim strUrl, oIE, oTag
strUrl = "http://forum.script-coding.com/"

Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 5000

For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, ".php") > 0 Then
        oTag.Click
        Do While Rnd < .9
            WScript.Sleep 100 + Rnd * 9000
            oTag.Click
        Loop        
        Exit For
    End If
Next

14

Re: VBS: Поиск по странице

Подобная ошибка будет возникать, если в результате "щелчка" по ссылке происходит переход на новую страницу (а, например, не выполнение js). В этом случае необходимо каждый раз после "щелчка" дожидаться готовности загружаемой страницы, находить интересующую ссылку заново и "щелкать".

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

15

Re: VBS: Поиск по странице

Спасибо.
А в этом же скрипте возможно такое сделать? Ожидание загрузки страницы я выставил с запасом.

Это как-то так нужно?

Dim strUrl, oIE, oTag
Set WshShell = WScript.CreateObject("WScript.Shell")
strUrl = "http://forum.script-coding.com/"

Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 5000


Do While Rnd < .9
For Each oTag in oIE.Document.GetElementsByTagName("a")
    If InStr(1, oTag.href, ".php") > 0 Then
        
        
            WScript.Sleep 9900 + Rnd * 2000
            oTag.Click
               
        Exit For
    End If
Next
Loop 

16

Re: VBS: Поиск по странице

А в этом же скрипте возможно такое сделать?

Мы этот вариант обсуждаем в соседней ветке, или я чего-то не понимаю? Может, всё же речь про то, как переходить по ссылкам одной страницы?

17

Re: VBS: Поиск по странице

Flasher пишет:

... Мы этот вариант обсуждаем в соседней ветке, или я чего-то не понимаю? ...

cyber54245, во избежание путаницы предлагаю дальнейшее обсуждение Вашего вопроса вести в более новой ветке http://forum.script-coding.com/viewtopic.php?id=10341. Соберите всё, что у Вас накопилось на данный момент, опубликуйте код скрипта(-ов), опишите что работает не так, какие вываливаются ошибки.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

18 (изменено: cyber54245, 2015-01-19 18:40:51)

Re: VBS: Поиск по странице

Готово, описал всё в:
http://forum.script-coding.com/viewtopi … 734#p90734