2017-02-06 3 views
0

ziehen Hoffe, dass es Ihnen gut geht. Die Site, von der ich versucht habe, Kategoriennamen zu scrappen, ist sehr einfach zu betrachten, wenn Sie bemerken, dass es ein inspiziertes Element ist, aber wenn ich einen Parser erstelle, kann ich die Daten nicht ziehen. Ich wollte nur die 7 Kategorie Namen von dieser Seite kratzen. Ich versuchte es mit allen möglichen Winkeln, scheiterte aber. Wenn jemand mir hilft, aufzuzeigen, was ich falsch mache, wäre ich ihm sehr dankbar. Danke im Voraus. FYC, ich gebe hier den Code ein, mit dem ich versucht habe.Kann nicht Daten von einer hartnäckigen Webseite mit vba

Sub ItemName() 

Dim http As New MSXML2.XMLHTTP60, html As New HTMLDocument 
Dim topics As Object, topic As Object, posts As Object, post As Object, ele As Object 
Dim x As Long 

x = 2 

http.Open "GET", "http://www.bjs.com/tv--electronics.category.3000000000000144985.2002193", False 
http.send 
html.body.innerHTML = http.responseText 

Set topics = html.getElementsByClassName("categories") 

For Each topic In topics 
    For Each posts In topic.getElementsByTagName("li") 
     For Each post In posts.getElementsByTagName("a") 
      Set ele = post.getElementsByTagName("h4")(0) 
      Cells(x, 1) = ele.innerText 
      x = x + 1 
     Next post 
    Next posts 
Next topic 

End Sub 
+1

Es ergreift anfänglich nicht die ganze Seite. Wenn Sie den Code durchgehen, wird ein mobiles Menü angezeigt. Ich habe versucht, den Request-Header "User-Agent" zu ändern, aber es zieht immer noch diese Informationen. [Ich frage mich, ob Sie mehr Glück mit der Browser-Kontrolle haben, im Vergleich zu MSXMLHttp] ( –

Antwort

0

Als Inhalt dieser Website werden dynamisch generiert, so dass es keine Möglichkeit für xmlhttp Anfrage ist die Seite Quelle zu fangen. Allerdings, um dieses Selen zu umgehen, ist es gut zu gehen, da es gut funktioniert, wenn es darum geht, mit javascriptheavy Website umzugehen. Ich habe in meinem unteren Skript nur Selen verwendet, um die Seitenquelle zu erhalten. Sobald es dazu kam, kehrte ich zur üblichen vba-Methode zurück, um den Prozess zu bewerkstelligen.

Sub Grabbing_item() 
    Dim driver As New ChromeDriver, html As New HTMLDocument 
    Dim post As Object 

    With driver 
     .get "http://www.bjs.com/tv--electronics.category.3000000000000144985.2002193" 
     html.body.innerHTML = .ExecuteScript("return document.body.innerHTML;") 
     .Quit 
    End With 

    For Each post In html.getElementsByClassName("name") 
     x = x + 1: Cells(x, 1) = post.innerText 
    Next post 
End Sub 
2

Hier ist eine mögliche Lösung, ich benutze das Internet Explorer-Objekt anstelle von MSXML. Ich kann die Daten von der Seite abrufen und das geht ziemlich schnell.

Hier ist der vollständige Code:

Option Explicit 

#If VBA7 Then 
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 
#Else 
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
#End If 

Sub ItemName() 
On Error GoTo errhand: 
    Dim ie As Object: Set ie = CreateObject("InternetExplorer.Application") 
    Dim topics As Object, topic As Object 
    Dim i As Byte 

    With ie 
     .Visible = False 
     .Navigate "http://www.bjs.com/tv--electronics.category.3000000000000144985.2002193" 
     Sleep 500 ' Wait for the page to start loading 
     Do Until .document.readyState = 4 Or .busy = False Or i >= 100 
      Sleep 100 
      DoEvents 
      i = i + 1 
     Loop 
    End With 

    Set topics = ie.document.getElementsByClassName("name ng-binding") 

    For Each topic In topics 
     'Print out the element's innertext 
     Debug.Print topic.innertext 
    Next 

    ie.Quit 
    Set ie = Nothing 
    Exit Sub 

errhand: 
    Debug.Print Err.Number, Err.Description 
    ie.Quit 
    Set ie = Nothing 
End Sub 
+0

) Vielen Dank Ryan für Ihre süße Anstrengung . Ich versuche, IE zu vermeiden, weil es meinen Computer verlangsamt. Btw, ich habe bereits gefunden, was ich vermisse, das ist: der Klassenname in meinem Code sollte "Ziegelstein" sein und nach geringfügiger Änderung meines Codes es funktioniert. Vielen Dank. – SIM

Verwandte Themen