2014-11-21 111 views

回答

52

有幾種方法可以做到這一點。這是我寫的一個答案,希望在瀏覽關鍵詞「從網站上抓取數據」時能夠找到所有的Internet Explorer自動化基礎知識,但請記住沒有什麼東西值得作爲您自己的研究(如果您不想堅持預先編寫的代碼,您無法自定義)。

請注意,這是單向,我不喜歡在性能方面(因爲它取決於瀏覽器速度),但這是很好理解互聯網自動化背後的基本原理。

1)如果我需要瀏覽網頁,我需要一個瀏覽器!所以我創建一個Internet Explorer瀏覽器:

Dim appIE As Object 
Set appIE = CreateObject("internetexplorer.application") 

2)我要求瀏覽器瀏覽目標網頁。通過使用「.Visible」屬性,我決定是否想讓瀏覽器執行其工作。當構建代碼很好有Visible = True,但是當代碼用於刮取數據很好,因此不會每次都看到它,所以Visible = False

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

3)網頁將需要一些時間加載。所以,我會等待,同時它很忙...

Do While appIE.Busy 
    DoEvents 
Loop 

4)好吧,現在頁面已加載。假設我想刮掉US30Y T-Bond的更改: 我只需點擊Internet Explorer上的F12查看網頁的代碼,然後使用指針(紅圈),我將點擊元素我想颳去看看如何達到我的目的。

enter image description here

5)我應該做的是直接的。首先,我會由ID屬性得到被包含該值的tr元件:

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

在這裏,我會得到td元件(具體的集合,tr是一行數據,而td是它的細胞,我們正在尋找第8,所以我會寫:?

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

爲什麼我寫的7,而不是8由於細胞的集合從0開始,所以第8元素的索引是7( 8-1)。短時分析這一行代碼:

  • .Cells()讓我訪問td元素;
  • innerHTML是包含我們尋找的值的單元格的屬性。

一旦我們有我們的價值,這是目前存儲到myValue變量,我們可以關閉IE瀏覽器,並通過將其設置爲Nothing釋放內存:

appIE.Quit 
Set appIE = Nothing 

好了,現在你有你的價值,你可以做任何你想做的事情:把它放到一個單元格中(Range("A1").Value = myValue),或者寫入一個表格的標籤(Me.label1.Text = myValue)。

我只想指出,這不是StackOverflow的工作原理:在這裏您可以發佈有關特定編碼問題的問題,但是您應該首先進行自己的搜索。我之所以回答一個沒有顯示太多研究成果的問題,只是因爲我看到它被問了好幾次,回到我學會如何去做這件事的時候,我記得我希望能有一些更好的支持開始使用。所以我希望這個答案只是一個「學習輸入」,而不是最好/最完整的解決方案,可以爲下一個遇到同樣問題的用戶提供支持。因爲我已經學會了如何編程,這要感謝這個社區,我喜歡認爲你和其他初學者可能會使用我的意見來發現美麗的編程世界。

享受你的做法;)

+1

絕對是一個有着多年VBA經驗的人的絕佳回答,但從來沒有想過要這樣做。這可能有助於我回答別人的問題。 – 2016-02-19 03:29:04

+0

另一位提問者想要更多,所以我根據你的出發點給他提供了他http://stackoverflow.com/questions/41848354/website-data-table-scraper/41902620#41902620 – 2017-01-27 20:40:08

2

,你可以用它代替Internet Explorer的winhttprequest對象,因爲它是很好的加載數據不包括畫面n的廣告,而不是下載完整的網頁,包括廣告n的圖像那些使Internet Explorer對象重比較winhttpRequest目的。

0

這個問題很久以前問過。但我認爲以下信息對新手很有用。其實你可以很容易地從類名得到這樣的值。

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 

如果你是新來的網絡抓取,請閱讀這篇博文。

Web Scraping - Basics

而且也有各種技術來提取網頁上的數據。這篇文章解釋了幾個例子。

Web Scraping - Collecting Data From a Webpage