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

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

Если можно, по пунктам опишите, пожалуйста, все необходимые процедуры. И если есть подхоящий код, то буду очень благодарен!
...
Рейтинг: 0 / 0
31.03.2012, 00:04
    #37732446
JleCTaM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
Вот составил код, однако возник затык с выводом данных с интернет страницы.
Макрос работает рандомно. Иногда выдает результат, иногда ошибку "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
31.03.2012, 03:41
    #37732550
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
> 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
31.03.2012, 09:32
    #37732598
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
Проблема в том, что IE.readyState = 4 после нажатия Submit остается с некоторой задержкой, то есть второй документ не грузится. Я попробовал ввести секундную задержку перед циклом IE.readyState <> 4 и ошибка перестала появляться. Но это неправильный подход, действительно лучше работать с MSXML
...
Рейтинг: 0 / 0
31.03.2012, 18:05
    #37732972
JleCTaM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
скукотища
Shocker.Pro

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

И кстати, макрос с 'Msxml2.XMLHTTP' работает раз в 10-15 быстрее, чем через ie !!!
...
Рейтинг: 0 / 0
31.03.2012, 18:12
    #37732976
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
Разумеется, ведь он не грузит в память тяжеленный иэксплорер )
...
Рейтинг: 0 / 0
31.03.2012, 18:27
    #37732988
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
> 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
31.03.2012, 21:19
    #37733075
JleCTaM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
Еще возникла такая проблемка:
переход по ссылке 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
31.03.2012, 22:24
    #37733106
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
> 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
01.04.2012, 00:57
    #37733235
JleCTaM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
скукотища,
здорово, что вы нашли url адреса страниц по ценным бумагам и по контрактам! Просто мое зрение отказывалось их находить на сайте, я все пытался именно через поисковую строку кликами выбрать категорию поиска. Огромное спасибо!

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


Возможно я что-то упустил в возможностях Msxml2.XMLHTTP...
...
Рейтинг: 0 / 0
01.04.2012, 01:29
    #37733255
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
>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
01.04.2012, 16:11
    #37733543
JleCTaM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
скукотища,
Работает!
В общем основной принцип понятен. Это действительно удобно! Спасибо! =)
...
Рейтинг: 0 / 0
09.08.2012, 19:09
    #37911274
omegastripes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
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
Период между сообщениями больше года.
12.05.2016, 11:32
    #39234117
Sagot_63
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA. Эксель. Поисковые запросы на сайтах
omegastripes,

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

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

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

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


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