Подтвердить что ты не робот

Excel VBA/HTML Нажмите следующую страницу из раскрывающегося списка

Я пишу свой первый скребок данных с помощью Excel и VBA. Я застрял, пытаясь перейти на следующую страницу веб-сайта. Исходный код выглядит следующим образом:

<li><a href="#" onclick="changePage(2); return false;">Page 2 of 24</a></li>

Это код VBA, который у меня есть, но не работает:

For Each l In ie.Document.getElementsByTagName("a")
    If l.href = "#" And l.onclick = "changePage(2); return false;" Then
        l.Item(2).Click
        Exit For
    End If
Next l

Когда я запускаю код, я не получаю никаких ошибок, но он, похоже, не идет на страницу 2. Имейте в виду, что после страницы 2 есть больше страниц. Моя идея заменяет "2" переменной позже и увеличить эту переменную на единицу. Но мне нужно сначала запустить его.

Спасибо, кто может помочь.

4b9b3361

Ответ 1

[Edit: У меня теперь есть решение, и код был заменен. -RDH]

Во-первых, я хочу упомянуть, что если данные, полученные таким образом, используются в коммерческих целях или в других целях, кроме личного использования, то это нарушает 2 раздела Условий обслуживания Kelley Blue Book (kbb.com).

FYI: Сайты, которые собирают, обновляют и поддерживают данные, такие как BlueBook или MLS, воспринимают свои данные очень серьезно, и им не нравятся люди, соскабливающие его. Я говорил со своим старым одноклассником, у которого есть степень в области компьютерных наук, и теперь я агент по недвижимости, и я упомянул ей о том, насколько здорово это сделать, чтобы очистить данные о жилье от MLS, и она почти перевернула меня, Просто говорю: людям платили за создание этих данных, и люди зарабатывали на жизнь этими данными. 'Достаточно. Мне удалось запустить код проблемы, создав веб-страницу на моем собственном сервере, у которой был тот же формат, который вы искали, так как я получаю другую версию сайта bluebook.com с тех пор, как я в Канаде. Я перенаправляюсь на kbb.com.

+++ Реальная проблема +++

Проблема заключается в том, что hrefs с символом # на самом деле является полным URL-адресом С#, присоединенным к концу, и когда вы проверяете событие onClick, оно фактически содержит декларацию полной функции, поэтому вам нужно искать только частичные строки.

' A good idea to declare the proper datatypes
' because IHTMLElement has the click event but IHTMLAnchorElements don't
Dim l As IHTMLElement
Dim htmlanchors As IHTMLElementCollection
' ...

Set htmlanchors = ie.Document.getElementsByTagName("a")

' Look through all the anchor tags on the page
    For Each l In htmlanchors
       ' Check to see the Href contains a # and the onclick event has specific code
        If InStr(l.href, "#") And InStr(l.onclick, "changePage(3); return false;") Then
            ' Click the current anchor link
            l.Click
            Exit For
        End If
Next l

Ответ 2

Вы пробовали

.FireEvent ("onclick")
Or
.FireEvent ("onmouseover")
.FireEvent ("onmousedown")
.FireEvent("onmouseup")

вместо .click? Иногда действия JavaScript не реагируют на .click.

Ответ 3

Рик - ниже мой весь код. Im в основном пытается очистить www.the bluebook.com.

Sub ScrapeData()

Dim ie As InternetExplorer
Dim ele As Object
Dim RowCount As Long
Dim myWebsite As String, mySearch1 As String, mySearch2 As String, mySearch3 As String
Dim Document As HTMLDocument

myWebsite = Range("Website").Value
mySearch1 = Range("search1").Value
mySearch2 = Range("search2").Value
mySearch3 = Range("search3").Value

Set mySheet = Sheets("Sheet1")
Range("A6").Value = "Company"
Range("B6").Value = "Address"
Range("C6").Value = "Contact"

RowCount = 7
Set ie = New InternetExplorer
ie.Visible = True
With ie
.Visible = True
.navigate (myWebsite)

Do While .Busy Or .readyState <> 4
    DoEvents
Loop

ie.Document.getElementById("search").Value = mySearch1
ie.Document.getElementById("selRegion").Value = mySearch2
ie.Document.getElementsByClassName("searchBtn")(0).Click

Do While .Busy Or _
    .readyState <> 4
    DoEvents
Loop

For Each ele In .Document.all
    Select Case ele.className
    Case "result_title"
    RowCount = RowCount + 1
    Case "cname"
    mySheet.Range("A" & RowCount) = ele.innerText
    Case "addy_wrapper"
    mySheet.Range("B" & RowCount) = ele.innerText
    End Select
Next ele
End With

'THIS IS THE CODE THAT IS NOT WORKING
For Each l In ie.Document.getElementsByTagName("a")
    If l.href = "#" And l.onclick = "changePage(3); return false;" Then
        l.Item(3).Click
        Exit For
    End If
Next l

Set ie = Nothing
End Sub