2014-11-21 17 views
8

Ich versuche, Daten von der Website zu kratzen: http://uk.investing.com/rates-bonds/financial-futures über VBA, wie Echtzeitpreis, dh Deutsch 5 YR Bobl, US 30Y T-Bond, habe ich versucht, Excel-Web-Abfrage, aber es kratzt nur die ganze Website, aber ich möchte nur die Rate kratzen, gibt es eine Möglichkeit, dies zu tun?Scrapping Daten von der Website mit vba

+0

Sie benötigen DOM/XML-Parser verwenden, dann können Sie entweder die Sammlung von Elementen durchlaufen oder auf bestimmte Elemente, die durch ihre XPath beziehen. –

Antwort

52

Es gibt mehrere Möglichkeiten, dies zu tun. Dies ist eine Antwort, die ich schreibe in der Hoffnung, dass alle Grundlagen der Internet Explorer-Automatisierung gefunden werden, wenn Sie nach den Schlüsselwörtern "Scraping Daten von der Website" suchen, aber denken Sie daran, dass nichts als Ihre eigene Forschung wert ist (wenn Sie nicht bleiben wollen) vordefinierte Codes, die Sie nicht anpassen können.

Bitte beachten Sie, dass dies one way ist, die ich in Bezug auf die Leistung nicht bevorzuge (da es von der Browsergeschwindigkeit abhängt), aber das ist gut zu verstehen, die Gründe hinter Internet-Automatisierung.

1) Wenn ich im Internet surfen muss, brauche ich einen Browser! Also erstelle ich einen Internet Explorer-Browser:

2) Ich frage den Browser, um die Zielwebseite zu durchsuchen. Durch die Verwendung der Eigenschaft ".Visible" entscheide ich, ob ich sehen möchte, ob der Browser seine Aufgabe erfüllt oder nicht. Beim Erstellen des Codes ist es nett, Visible = True zu haben, aber wenn der Code zum Scraping von Daten arbeitet, ist es schön, es nicht jedes Mal zu sehen, also Visible = False.

With appIE 
    .Navigate "http://uk.investing.com/rates-bonds/financial-futures" 
    .Visible = True 
End With 

3) Die Webseite benötigt etwas Zeit zum Laden. Also, ich werde warten, während es beschäftigt ist ...

Do While appIE.Busy 
    DoEvents 
Loop 

4) Nun, jetzt ist die Seite geladen. Nehmen wir an, ich möchte den Wechsel des US30Y T-Bond scraping: Was ich tun wird, ist nur klicken Sie auf F12 im Internet Explorer, um den Code der Webseite zu sehen, und mit dem Zeiger (im roten Kreis) werde ich auf das Element klicken dass ich kratzen möchte, um zu sehen, wie ich meinen Zweck erreichen kann.

enter image description here

5) Was soll ich tun, ist ziemlich einfach. Zunächst einmal, ich von der ID-Eigenschaft des tr Element erhalten wird, die den Wert enthält:

Set allRowOfData = appIE.document.getElementById("pair_8907") 

Hier werde ich eine Sammlung von td Elemente erhalten (genauer gesagt, ist tr eine Reihe von Daten und die td sind seine Zellen Wir sind für den 8. suchen, so will ich es schreiben.?

Dim myValue As String: myValue = allRowOfData.Cells(7).innerHTML 

Warum habe ich schreibe 7 statt 8 Da die Sammlungen von Zellen, die von 0 beginnt, so dass der Index des achten Elements 7 (8-1) Kurzes Analysieren dieser Codezeile:

  • .Cells() ermöglicht mir den Zugriff auf die td Elemente;
  • innerHTML ist die Eigenschaft der Zelle, die den gesuchten Wert enthält.

Sobald wir unseren Wert haben, die nun in die myValue Variable gespeichert ist, können wir schließen einfach den IE-Browser und den Speicher frei, indem sie es auf Nothing setzen:

appIE.Quit 
Set appIE = Nothing 

Nun, jetzt haben Sie Ihr Wert und Sie können damit machen, was Sie wollen: Legen Sie es in eine Zelle (Range("A1").Value = myValue) oder in ein Etikett eines Formulars (Me.label1.Text = myValue).

Ich möchte Sie nur darauf hinweisen, dass StackOverflow nicht so funktioniert: hier stellen Sie Fragen zu bestimmten Codeproblemen, aber Sie sollten zuerst Ihre eigene Suche machen. Der Grund, warum ich eine Frage beantworte, die nicht zu viel Forschungsaufwand zeigt, ist nur, dass ich es mehrmals gefragt habe und zurück zu der Zeit, als ich das lernte, erinnere ich mich, dass ich gerne etwas besseres gehabt hätte Unterstützung für den Einstieg. Ich hoffe also, dass diese Antwort, die nur eine "Lerneingabe" und nicht die beste/vollständigste Lösung ist, eine Unterstützung für den nächsten Benutzer sein kann, der das gleiche Problem hat. Weil ich gelernt habe, dank dieser Community zu programmieren, und ich denke, dass Sie und andere Anfänger meinen Input nutzen könnten, um die schöne Welt des Programmierens zu entdecken.

Ihre Praxis Genießen;)

+1

Definitiv eine großartige Antwort von jemandem mit jahrelanger Erfahrung mit VBA, aber nie daran gedacht. Und es kann mir helfen, die Frage eines anderen zu beantworten. –

+0

Ein anderer Fragesteller wollte mehr, also gab ich ihm basierend auf Ihrem Ausgangspunkt http://stackoverflow.com/questions/41848354/website-data-table-scraper/41902620#41902620 –

2

Sie WinHttpRequest Objekt anstelle des Internet Explorer verwenden können, wie es Daten gut zu laden Bilder n Anzeige anstelle des Herunterladens voll Webseite einschließlich Werbung ohne n Bilder diejenigen Internet Explorer Objekt schwer machen zu WinHttpRequest vergleichen Objekt.

0

Diese Frage wurde lange vorher gestellt. Aber ich dachte, die folgenden Informationen werden für Neulinge nützlich sein. Tatsächlich können Sie die Werte aus dem Klassennamen einfach so erhalten.

Sub ExtractLastValue() 

Set objIE = CreateObject("InternetExplorer.Application") 

objIE.Top = 0 
objIE.Left = 0 
objIE.Width = 800 
objIE.Height = 600 

objIE.Visible = True 

objIE.Navigate ("https://uk.investing.com/rates-bonds/financial-futures/") 

Do 
DoEvents 
Loop Until objIE.readystate = 4 

MsgBox objIE.document.getElementsByClassName("pid-8907-last")(0).innerText 

End Sub 

Und wenn Sie zum Web Scraping neu sind, lesen Sie bitte diesen Blogbeitrag.

Web Scraping - Basics

Und auch gibt es verschiedene Techniken, um Daten von den Webseiten zu extrahieren. Dieser Artikel erklärt einige von ihnen mit Beispielen.

Web Scraping - Collecting Data From a Webpage

Verwandte Themen