Excel 股市資料抓取服務

提供Excel 股市資料抓取服務
可透過下列方式聯絡我
Email: iamaraymond@yahoo.com.tw
(FB請先加我好友再私訊,不然會跑到陌生訊息)

課程:
Excel VBA 金融資料抓取 | 打造股票研究系統 (學生數: 602,學員評價5顆星)
無痛起步-Excel VBA超入門實戰(學生數: 413,學員評價5顆星)


2018年5月24日 星期四

HTMLFile物件的侷限性

今天在抓新聞資料時,想使用HTMLFile物件去抓新聞內文

http://www.cna.com.tw/news/afe/201805230211-1.aspx

在抓內文時可看到有很多像是Div、P這種很難定位的Tag,也沒有ID可以使用
但幸好找到了section這個特別的Tag



Sub test1()

Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")

Dim myHTML As Object
Set myHTML = CreateObject("HTMLFile")

With myXML
    .Open "GET", "http://www.cna.com.tw/news/afe/201805230211-1.aspx", False
    .send
    myHTML.body.innerHTML = .responseText
End With

Set Section = myHTML.getElementsByTagName("Section")(0)
Debug.Print Section.innerText
Set myXML = Nothing
End Sub

結果發現Section的innertext竟然是空的。。。
試了幾下發現有些Tag的innerText就是抓不到
像是這次範例的Section,還有有些文章會用的Article的Tag

抓不到怎麼辦呢,有兩種做法
第一種是用文字處理的語法,但這個應該會處理到瘋掉
第二種,既然知道內文肯定會有"記者"這兩個字
就可以用這關鍵字來定位,來找出包含此關鍵字的P Tag
找到之後,因為知道P Tag的上一層包含整個內文
所以可以使用parentNode,也就是P的父節點
再使用debug.print 將內文印出來

Sub test2()

Dim XML As Object
Set XML = CreateObject("Microsoft.XMLHTTP")

Dim HTML As Object
Set HTML = CreateObject("HTMLFile")

With XML
.Open "GET", "http://www.cna.com.tw/news/afe/201805230211-1.aspx", False
.send
HTML.body.innerHTML = .responseText
End With

Set section = HTML.getElementsByTagName("p")
For Each p In section
    If p.innertext Like "*中央社*" Then
        Debug.Print p.ParentNode.innertext
    End If
Next

Set myXML = Nothing
End Sub

第三種方式就是借助IE,利用IE來替代
首先開啟一個空白的網頁
再將原始碼輸入進去
但和HTMLFile不同的是,IE可以抓到這個section

Sub test3()

Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")

Dim IE As Object
Set IE = CreateObject("internetExplorer.Application")

With IE
    .Visible = False
    .navigate "about:blank"
    Set doc = .document
End With

With myXML
    .Open "GET", "http://www.cna.com.tw/news/afe/201805230211-1.aspx", False
    .send
    doc.body.innerHTML = .responseText
End With

Set section = doc.getElementsByTagName("Section")(0)
Debug.Print section.innertext
Set myXML = Nothing
Set myIE = Nothing
End Sub

當然,速度還是有差,但不多
自己試的情況是
第二種:0.24秒
第三種:0.57秒

3 則留言:

  1. 您好 請問針對test1的部分,我用Tagname("a")
    然後用for each找到我要的href,
    但不知道為什麼.click沒有反應

    回覆刪除
  2. Dim myXML As Object
    Set myXML = CreateObject("Microsoft.XMLHTTP")

    Dim myHTML As Object
    Set myHTML = CreateObject("HTMLFile")

    With myXML
    .Open "GET", "URL", False
    .send
    myHTML.body.innerHTML = .responseText
    End With

    Set Section = myHTML.getElementsByTagName("a")
    'Debug.Print Section.innerText
    For Each a In Section
    If a.innerText = "the text" Then
    a.Click
    End If
    Debug.Print a.innerText
    Next

    回覆刪除
  3. 我想知道一个问题,asp可以直接用这个方法来抓取网页嘛?Set IE = CreateObject("internetExplorer.Application")。然后需要设置什么权限呢?针对I_user

    回覆刪除