powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA. Эксель. Поисковые запросы на сайтах
16 сообщений из 16, страница 1 из 1
VBA. Эксель. Поисковые запросы на сайтах
    #37730066
JleCTaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
доброго времени суток! Подскажите новичку, как можно в Экселе через vba на сайте
http://rts.micex.ru/ru/search.aspx
вбить в строку поиска определенную бумагу (напр, Газпром) и вывести в Эксель количество объявлений по бумаге.

Не могу разобраться какие библиотеки для этого нужно подключить к ВБА и как в итоге отправлять информацию на сайт

Если можно, по пунктам опишите, пожалуйста, все необходимые процедуры. И если есть подхоящий код, то буду очень благодарен!
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37732446
JleCTaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот составил код, однако возник затык с выводом данных с интернет страницы.
Макрос работает рандомно. Иногда выдает результат, иногда ошибку "Object variable or With block variable not set" в строке tempHTML = IE.document.body.innerHTML

В чем причина такого рандома?


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Sub open_GAZR()

Dim IE As Object
Dim inpS As MSHTML.IHTMLElementCollection
Dim el As MSHTML.IHTMLElement
Dim A, m, pos As Integer
Dim tempHTML, St As String

Set IE = CreateObject("internetexplorer.application")
'IE.Visible = True
IE.navigate "rts.micex.ru/ru/csearch.aspx"

Do While IE.readyState <> 4
    DoEvents
Loop

Set inpS = IE.document.getElementsByTagName("input")
For Each el In inpS
    If el.Name = "sstr" Then
        el.Value = "Газпром"
    End If
    If el.Name = "bSubmit" Then
        el.Click
    End If
Next el

Do While IE.readyState <> 4
    DoEvents
Loop

A = 0
Do
    A = A + 1
    tempHTML = IE.document.body.innerHTML
Loop Until InStr(A, tempHTML, "Найдено")

pos = InStr(A, tempHTML, "Найдено")
m = pos + 9
Do Until Mid(tempHTML, m, 1) = Chr(32)
    m = m + 1
Loop

St = Mid(tempHTML, pos + 9, m - pos - 9)

MsgBox St

End Sub
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37732550
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> JleCTaM
> Иногда выдает результат, иногда ошибку "Object variable or With block variable not set" в строке tempHTML = IE.document.body.innerHTML
>
> В чем причина такого рандома?

COM-сервер IE не всегда успевает ответить.

Попробуйте вместо 'internetexplorer.application' использовать 'Msxml2.XMLHTTP'. Может понравится.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Sub postXMLHTTP()
Const URL$ = "http://rts.micex.ru/ru/csearch.aspx"
Const sFind$ = "Газпром"

Dim rq, param
Dim s$, k&

Set rq = CreateObject("Msxml2.XMLHTTP")
param = "sstr=" & sFind

rq.Open "POST", URL, False
rq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
rq.Send param

If rq.readystate = 4 And rq.Status = 200 Then
    s = rq.responsetext
    k = InStr(1, s, "Результаты", vbTextCompare)
    If k > 0 Then
        MsgBox Mid$(s, k + 54, 19), vbInformation, "Искали: '" & sFind & "'"
    Else
        MsgBox "Ну не шмогла я ...", vbInformation, "Искали: '" & sFind & "'"
    End If

Else
    MsgBox "Пичалька", vbExclamation, "Страница: " & URL
End If

Set rq = Nothing

End Sub

...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37732598
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что IE.readyState = 4 после нажатия Submit остается с некоторой задержкой, то есть второй документ не грузится. Я попробовал ввести секундную задержку перед циклом IE.readyState <> 4 и ошибка перестала появляться. Но это неправильный подход, действительно лучше работать с MSXML
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37732972
JleCTaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища
Shocker.Pro

огромное спасибо за помощь, вы мне реально помогли!

И кстати, макрос с 'Msxml2.XMLHTTP' работает раз в 10-15 быстрее, чем через ie !!!
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37732976
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется, ведь он не грузит в память тяжеленный иэксплорер )
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37732988
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Shocker.Pro
> Разумеется, ведь он не грузит в память тяжеленный иэксплорер )

дело скорее не в IE ( хотя и в нём тоже ), а в этом цикле
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
A = 0
Do
    A = A + 1
    tempHTML = IE.document.body.innerHTML
Loop Until InStr(A, tempHTML, "Найдено")

pos = InStr(A, tempHTML, "Найдено")
m = pos + 9
Do Until Mid(tempHTML, m, 1) = Chr(32)
    m = m + 1
Loop

Изврат ещё тот.
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37733075
JleCTaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще возникла такая проблемка:
переход по ссылке http://rts.micex.ru/ru/search.aspx отправляет пользователя на поиск материалов сайта, но на сайте http://rts.micex.ru/ еще есть поиск по "ценным бумагам" и "контрактам"... (выбор над строкой поиска)
То есть, таким образом, чтобы выполнить поиск по категории "ценная бумага", нужно программно на нее нажать.
Вопрос в том, можно ли это сделать средствами Msxml2.XMLHTTP?

Я уже попытался на сайте http://rts.micex.ru/ выбрать категорию "ценная бумага", ввести Газпром и нажать на поиск,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Sub openGAZR_1()

Dim IE As Object
Dim inpS As MSHTML.IHTMLElementCollection
Dim el As MSHTML.IHTMLElement

Set IE = CreateObject("internetexplorer.application")
IE.Visible = True
IE.navigate "rts.micex.ru"

Do While IE.readyState <> 4
    DoEvents
Loop

Set inpS = IE.document.getElementsByTagName("a")

For Each el In inpS
    If el.innerHTML = "Ценная бумага" Then
        el.Click
    End If
Next el

Do While IE.readyState <> 4
    DoEvents
Loop

Set inpS = IE.document.getElementsByTagName("input")
For Each el In inpS
    If el.Name = "sstr" Then
        el.Value = "Газпром"
    End If
    If el.Type = "submit" Then
        el.Click
        Exit For
    End If
Next el

Do While IE.readyState <> 4
    DoEvents
Loop

end sub




но теперь не знаю, как можно данные со страницы через
Код: vbnet
1.
rq.Open "GET", URL, False

получить, какой URL нужно писать?
или как можно просмотреть текущую загруженную страницу?
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37733106
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> JleCTaM
> {skipped}
> но теперь не знаю, как можно данные со страницы через
>
> rq.Open "GET", URL, False
>
> получить, какой URL нужно писать?
> или как можно просмотреть текущую загруженную страницу?

(!) в _данной_ задаче надо использовать метод POST

rq.Open " POST ", URL, False

rq.responsetext даст Вам все даные, возвращенные сервером на Ваш запрос.
Какой URL - это Вам решать ( задача то Ваша ).
Просмотреть текущую загруженную страницу можно в браузере...
полуофф
Код: vbnet
1.
2.
3.
4.
5.
6.
' поиск по эмитентам и ценным бумагам 
URL= "http://rts.micex.ru/ru/spot/issues.aspx"


'поиск по контрактам ( есть доп.опции поиска )
URL= "http://rts.micex.ru/ru/derivatives/contracts.aspx"

...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37733235
JleCTaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,
здорово, что вы нашли url адреса страниц по ценным бумагам и по контрактам! Просто мое зрение отказывалось их находить на сайте, я все пытался именно через поисковую строку кликами выбрать категорию поиска. Огромное спасибо!

Но вот интересно на будущее, если придется проводить поиск по сайтам, на которых будет форма, в которой можно будет выбирать закладки и причем url адрес страницы меняться не будет (например, выбор между простым поиском и расширенным внутри формы), то уже средства Msxml2.XMLHTTP получается не помогут? Как я понимаю, в таких случаях придется запускать IE и делать через
Код: vbnet
1.
Set IE = CreateObject("internetexplorer.application")


Возможно я что-то упустил в возможностях Msxml2.XMLHTTP...
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37733255
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>JleCTaM
> Но вот интересно на будущее, если придется проводить поиск по сайтам, на которых ...
> {sipped}
> то уже средства Msxml2.XMLHTTP получается не помогут?

Помогут.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
' (!) страница поиска 
'    csearch.aspx
' а не 
'    search.aspx
Const URL$ = "http://rts.micex.ru/ru/csearch.aspx"

Const WHERE$ = "i"
rem a - поиск в материалах
rem i - поиск в ценных бумагах
rem f - поиск в контрактах

Const sFind$ = "Газпром"

' {skipped}


' в зависимости от значения поля swhere будет искать
' в материалах сайта (по-умолчанию), либо в ценных бумагах, либо в контрактах...
param = "sstr=" & sFind & "&swhere=" & WHERE

rq.Open "POST", URL, False
rq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
rq.Send param

If rq.readystate = 4 And rq.Status = 200 Then
    s = rq.responsetext    
    ' ...
else
    ' ...
end if

set rq = nothing

...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37733543
JleCTaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,
Работает!
В общем основной принцип понятен. Это действительно удобно! Спасибо! =)
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #37911274
omegastripes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПроблема в том, что IE.readyState = 4 после нажатия Submit остается с некоторой задержкой, то есть второй документ не грузится. Я попробовал ввести секундную задержку перед циклом IE.readyState <> 4 и ошибка перестала появляться. Но это неправильный подход, действительно лучше работать с MSXML

Нередко после нажатия Submit изменяется адрес страницы, в таких случаях с IE можно отслеживать IE.LocationURL
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Sub open_GAZR()

Dim IE As Object
Dim inpS As MSHTML.IHTMLElementCollection
Dim el As MSHTML.IHTMLElement
Dim A, m, pos As Integer
Dim tempHTML, St As String
Dim Loc As String

Set IE = CreateObject("internetexplorer.application")
IE.Visible = True
IE.navigate "rts.micex.ru/ru/csearch.aspx"

Do While IE.readyState <> 4
    DoEvents
Loop

Loc = IE.LocationURL ' Location URL before Click

Set inpS = IE.document.getElementsByTagName("input")
For Each el In inpS
    If el.Name = "sstr" Then
        el.Value = "Газпром"
    End If
    If el.Name = "bSubmit" Then
        el.Click
    End If
Next el

Do While Loc = IE.LocationURL ' Wait for change
    DoEvents
Loop

Do While IE.readyState <> 4
    DoEvents
Loop

A = 0
Do
    A = A + 1
    tempHTML = IE.document.body.innerHTML
Loop Until InStr(A, tempHTML, "Найдено")

pos = InStr(A, tempHTML, "Найдено")
m = pos + 9
Do Until Mid(tempHTML, m, 1) = Chr(32)
    m = m + 1
Loop

St = Mid(tempHTML, pos + 9, m - pos - 9)

MsgBox St

End Sub

...
Рейтинг: 0 / 0
Период между сообщениями больше года.
VBA. Эксель. Поисковые запросы на сайтах
    #39234117
Sagot_63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
omegastripes,

Очень интересная тема.
А если URL заранее не известен и есть только строка поиска и кнопка. Как в таком случае использовать 'Msxml2.XMLHTTP'??
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #39234191
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспользоваться Fiddler'ом, он подскажет урл.
...
Рейтинг: 0 / 0
VBA. Эксель. Поисковые запросы на сайтах
    #39234441
Sagot_63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Но если этих адресов очень много.? и плюс они могут изменяться.

Задача сводится к тому что нужно выполнить поиск по сайту. Поиск осуществляется по наименованию компании, затем нужно проверить сколько компаний получилось в списке, если больше 1 то выбрать нужную, загрузить ее страницу и далее забрать инфу. И так очень много раз. Еще и сайтов несколько.

А через ком вообще не получается, не читается свойство document
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA. Эксель. Поисковые запросы на сайтах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]