利用IE法提取網頁數據基礎

2021-01-11 VBA語言專家

「VBA信息獲取與處理」教程中第八個專題「VBA與HTML文檔」的第七節「HTML DOM的對象事件及關聯」太枯燥了,希望想掌握這方面知識的朋友能參考我的教程學習。我們今天 開始第九個專題的學習「利用IE抓取網絡數據」。

我們的網抓部分在講解了XMLHTTP方法後,利用兩個專題的進度進行了一些和VBA關係不是很大的有關網絡知識的講解,這兩個專題對於我們重新認識網抓數據有著非常重要的意義,雖然我的講解還不能面面俱到,但對於我經常倡導的VBA定位來說,是足夠的,再者,學習是個不斷積累前進的過程,要掌握的是一些基本的理論,然後把這些應用到自己的實際中去,這才是關鍵。從這個專題開始我們繼續網抓的學習。這個專題是利用IE抓取網絡數據。其實就是利用控制項來完成我們的工作。

第一節 利用IE法提取網頁數據基礎

為了獲取網頁的數據,我們可以通過創建IE控制項或webbrowser控制項,結合htmlfile對象的方法和屬性,模擬瀏覽器操作,獲取瀏覽器頁面的數據。

這種方法可以模擬大部分的瀏覽器操作。瀏覽器能看到的數據就能用代碼獲取,但是有個致命的缺點:除去各種彈窗相當煩人外,兼容性也確實是個很傷腦筋的問題。在我自己的實踐中感覺這種方法不是很穩定(僅僅是感覺)。

1 IE模型的創建

我們在實際工作中遇到網站和網頁相關問題,例如:如何下載網頁數據?網頁之間的通訊是怎麼實現的、它們能不能被控制等等。如果你是用VB/VBA/腳本或其它支持自動化對象(AUTOMATION)的語言編程,有一個值得了解的方法是掌握對象模型:將網頁視為對象來控制,這個方法需要了解的是IE的自動化對象(InternetExplorer.Application)或IE控制項(Microsoft Internet Controls),以及標準的文檔對象模型(Document)。相關的知識我在前兩個專題中做了大量的講解,這裡就不再詳細的說明了。

我給出下面的代碼:

Set ie = CreateObject("InternetExplorer.Application") 』創建對象

ie.Visible = True 』使IE頁面可見,做完這一步,在VBA之外可以看到一個新的IE

ie.navigate "about:blank" 』建立一個空白頁

上面這幾行代碼的作用是創建一個IE應用程式對象,並打開一個空白的網頁。這個網頁獨立於VBA的應用程式(WORD或EXCEL)之外,事實上,你必須自已關掉它,或者用ie.Quit下令退出——注意一下,單純的關閉VBA或SET ie=nothing是不會退出這個網頁的。我們經常用的是將第3行的字符串替換成一個網站的名字,或者替換成一個你主機中的文檔名,也可以是一個圖片名,都是可以的。和你在IE地址欄輸入名稱瀏覽這些文檔是一樣效果。

如果僅僅是創建了一個空的模型是沒有任何利用的價值的,我們需要真正的網頁,這時就需要我們在VBA的應用程式外打開一個完整的網頁了,直到網頁完全加載我們的操作才能向下進行。

2 IE網頁頁面的加載

我們修正一下上面的那段打開空網頁的代碼:

Sub mynz()

Set ie = CreateObject("InternetExplorer.Application") 』創建對象

ie.Visible = True 』使IE頁面可見,做完這一步,在VBA之外可以看到一個新的IE

ie.navigate " https://baijiahao.baidu.com" 』建立一個空白頁

Do Until .ReadyState = 4 '檢查網頁是否加載完畢(4表示完全加載)

DoEvents 『循環中交回工作權限給系統,以免「軟死機」

Loop

End sub

在上面的代碼中增加了幾行:

Do Until .ReadyState = 4 '檢查網頁是否加載完畢(4表示完全加載)

DoEvents 『循環中交回工作權限給系統,以免「軟死機」

Loop

這幾行代碼可以保證網頁的加載完成,這是根據ie.ReadyState的返回值來判斷的。

readyState一共有5中狀態:

狀態 含義 說明

0 未初始化 對象已建立,但是尚未初始化(尚未調用open方法)

1 初始化 對象已建立,尚未調用send方法

2 發送數據 send()方法已調用,但是當前的狀態及http頭未知

3 數據傳送中 已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤

4 數據接收完畢 此時可以通過通過responseBody和responseText獲取完整的回應數據

通過以上的分析,我們可以看出,只用當.ReadyState = 4時網頁的數據才是有效的數據。

3 IE頁面數據的獲得

當網頁加載完畢,剩下的工作就是從網頁中抓取數據了,數據的抓取主要是利用控制項對象的屬性和方法。

1)用Set doc = ie.Document 取得網頁的文檔對象

從文檔對象(Document)以下展開的對象模型,它代表網頁的內容,和前面那個IE的應用程式不是同一個體系.

Documnet(文檔)是文檔對象模型,相當於OFFICE對象中的APPLICATION,取得Document之後,不論修改網頁還是讀寫網頁,還是觸發事件,一切都好說,每個URL都對應有一個Documnet(這是假如定成功導航Navigate到那個URL完成,因此之前要求確定IE對象READSTATE,以確定對應URL的Document打開了)

2) 在Documnet之下可以取得documentElement和body兩個節點。

可以用下面的語句:

set xbody=doc.Body 『取得body對象

set xDoc=doc. documentElement 『取得根節點

body前面已經說過,相當於標記的對象,根節點相當於網頁中的標記元素的對象,MHTML的類型庫定義裡,它們都屬於HTMLHtmlElement類型的對象,下面我把這種類型的對象稱為一個「節點」,不過要注意的是文檔對象不是節點對象,它是HTMLDocument類型。根節點和body節點不同的是根節點包括整個網頁,在HTML的文檔對象模型中,這類對象有幾種屬性可以取得其中的內容:

對象.innerHtml 『對象內部的HTML文本

對象.OuterHtml 『對象中的HTML文本,包括對象本身的HTML標記在內

對象.innerText 『對象內部的TEXT,不包括HTML標記

對象.OuterText 『同上,包括對象本身的文本

所以,如果我們要抓取某個網站的所有HTML內容,代碼可以這樣寫:

set doc=ie.Document

set xDoc=doc. documentElement 『取得根節點

strX=xDoc.OuterHtml 『取得所有的HTML內容

3) 每一個標記節點對象之下都有一個名為ChildNodes的集合,它包含了「直屬於本節點下的標記」,就象是文件目錄,根目錄下的子目錄.

我們可以看到:HTML標記是文檔的根節點,是Document的Childnodes集合中的一個成員(Document不是節點,是另一種類型對象,上一級文檔,但它可以有下級節點集合,正如磁碟可以有下級目錄,但它本身不是目錄),BODY是根節點的ChildNodes集合中的一個成員,而DIV和P兩個節點則是BODY的ChildNodes集合中的兩個成員,同樣也有自已的Childnoes集合。

我們要注意:文檔對象模型中,集合與OFFICE的集合有所不同,集合是從0開始計數的,計數屬性是Length而不是Count。

4)除了ChildNodes集合,大家在網頁文檔對象中還常見到的就是很大氣的一種集合:All集合,這是「最糊塗」的一種集合,文檔和各級節點都帶有這個集合,正如這個名字所示,它是不分層次的,但用起來也很方便:

Set doc=ie.Document

Set xCols=doc.All 』取得文檔中的所有節點集合

Set xbCols=doc.body.All 』取得body節點下所有的節點集合

雖然任何標記節點都有ALL集合,但我們還是喜歡用DOCUMENT的ALL,原因無它,文檔最大,一鍋燴的ALL找起來也最合適。ALL查找是有條件的:如果這個標記沒有ID,你無法查到它的名字。

不過,ALL集合有一個很方便的特性:ID可以掛到ALL集合之下:

strX=doc.All.mytag.innerhtml

5)獲得文檔對象的getElementsByName集合,可以利用下面的方法:

set mydivs=doc. getElementsByName(「div」) 『取得所有DIV標記,注意還是集合

6) 文檔對象的FORMS集合,因為大部分網頁的數據提交都是通過FORM標記提交的:

Set myForms=doc.Forms 』取得所有的FORM標記

Set frmX=myForms.item(0) 』第1個FORM

FORM標記節點代表的對象是很多朋友關心的內容——在網頁對象中,它可以發送數據到伺服器,使伺服器刷新網頁(實際上是伺服器按某個格式約定發回數據),我們可以把網頁的FORM看成是一個遠程的函數調用接口,FORM標記中的ACTION指向的URL地址就是函數入口,而FORM標記內的各個INPUT標記節點就是函數的參數,當發出FORM.Submit方法時,就是遠程調用函數了,在伺服器端,諸如ASP,PHP就是老老實實找FORM的參數,不管你是用GET還是POST:

frmX.submit 』相當於用戶在頁面上按下FORM的發送按鍵

上面我羅列了獲取網頁數據的一般的方法,並沒有什麼特別的使用要求,大家可以根據自己的習慣來利用,這個專題之後的內容就是靈活運用這些知識點來解決實際問題了。

本節知識點回向:

如何提交表單?如何下載圖片的地址?如何獲得表的數據?

積木編程的思路內涵:

在我的系列書籍中一直在強調「搭積木」的編程思路,這也是學習利用VBA的主要方法,特別是職場人員,更是要採用這種方案。其主要的內涵:

1代碼不要自己全部的錄入。你要做的是把積木放在合適的位置然後去修正代碼,一定要拷貝,從你的積木庫中去拷貝,然後修正代碼,把時間利用到高效的思考上。

2 建立自己的「積木庫」。平時在學習過程中,把自己認為有用的代碼放在一起,多積累,在用到的時候,可以隨時拿來。你的積木庫資料越多,你做程序的思路就會越廣。

VBA的應用界定

VBA是利用Office實現個人小型辦公自動化的有效手段(工具)。這是我對VBA的應用界定。在取代OFFICE新的辦公軟體沒有到來之前,誰能在數據處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!

我記得20年前自己初學VBA時,那時的資料甚少,只能看源碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重複我之前的經歷,我根據自己多年VBA實際利用經驗,推出了六部VBA專門教程:

第一套:VBA代碼解決方案是VBA中各個知識點的講解,教程共147講,覆蓋絕大多數的VBA知識點,初學必備;

第二套:VBA資料庫解決方案資料庫是數據處理的專業利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法和實例操作,適合中級人員的學習。

第三套:VBA數組與字典解決方案數組和字典是VBA的精華,字典是VBA代碼水平提高的有效手段,值得深入的學習,是初級及中級人員代碼精進的手段。

第四套:VBA代碼解決方案之視頻是專門面向初學者的視頻講解,可以快速入門,更快的掌握這門技能。這套教程是第一套教程的視頻講解,聽元音更易接受。

第五套:VBA中類的解讀和利用這是一部高級教程,講解類的虛無與肉身的度化,類的利用雖然較少,但仔細的學習可以促進自己VBA理論的提高。這套教程的領會主要是讀者的領悟了,領悟一種佛學的哲理。

第六套教程:《VBA信息獲取與處理》,這是一部高級教程,涉及範圍更廣,實用性更強,面向中高級人員。教程共二十個專題,包括:跨應用程式信息獲得、隨機信息的利用、電子郵件的發送、VBA網際網路數據抓取、VBA延時操作,剪切板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定製工作表信息函數等等內容。

大家可以根據以上資料1→3→2→6→5或者是4→3→2→6→5的順序逐漸深入的逐漸學習。教程提供講解的同時提供了大量的積木,如需要可以WeChat: NZ9668

學習VBA是個過程,也需要經歷一種枯燥的感覺

如太白詩云:眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山。學習的過程也是修心的過程,修一個平靜的心。在代碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。利人就是利己。這些教程也是為幫助大家起航,助上我自己之力,我的上述教程是我多的經驗的傳遞,

「水善利萬物而不爭」,綿綿密密,微則無聲,巨則洶湧。學習亦如此,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時再去做自欺欺人的言論。要努力提高自己,用一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。茶,滿也好,少也好,不要計較;濃也好,淡也好,其中自有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。在後疫情更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。學習時微而無聲,利用時則巨則洶湧。

每一分收穫都是成長的記錄,怎無憑,正是這種執著,成就了朝霞的燦爛。最後將一闕詞送給致力於VBA學習的朋友,讓大家感受一下學習過程的枯燥與執著:

浮雲掠過,暗語無聲,

唯有清風,驚了夢中啼鶯。

望星,疏移北鬥,

奈將往事雁同行。

阡陌人,昏燈明暗,

忍顧長亭。

多少VBA人,

暗夜中,悄聲尋夢,盼卻天明。

怎無憑!

回向學習利用VBA的歷歷往事,不勝感慨,謹以這些文字給大家,分享我多年工作實際經驗的成果,隨喜這些有用的東西,給確實需要利用VBA的同路人。

分享成果,隨喜正能量

相關焦點

  • 在Scrapy中如何利用CSS選擇器從網頁中採集目標數據——詳細教程...
    /CSS基礎/CSS選擇器和Xpath選擇器的功能是一致的,都是幫助我們去定位網頁結構中的某一個具體的元素,但是在語法表達上有區別。Xpath選擇器明明已經可以幫助我們提取信息了,為什麼還要學習CSS選擇器呢?蘿蔔青菜各有所愛,對於不同知識背景的小夥伴,都可以來提取網頁信息。
  • 利用Power BI批量獲取豆瓣電影數據
    要想獲得詳情頁的數據,首先就需要先得到每部電影的詳情頁網址,批量獲取網址的方法,之前也介紹過(參考:Power BI如何獲取網頁中的連結?這個方法非常好用)。 先打開前兩部電影的詳情頁並將網址複製下來,然後利用"使用示例添加表"的功能,將前兩行數據粘貼到前兩行,系統就可以自動識別並補全剩餘的信息。
  • 入門Python爬蟲——提取數據篇
    作者: 李菲 來源:人工智慧學習圈前言在提取數據這一環節,爬蟲程序會將我們所需要的數據提取出來。在上一篇文章《入門Python爬蟲 -- 解析數據篇》中,我們已經了解過了解析數據的要點。而今天的內容,主要會在此基礎上進一步提取出我們認為有價值的信息。提取數據知識點在提取數據的過程中,我們依舊會用到熟悉的BeautifulSoup庫。下面我會介紹一下其中比較常用的兩個方法:find()以及find_all()。find():提取首個符合要求的數據。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    網絡爬蟲,也叫作網絡數據採集,是指通過編程從Web伺服器請求數據(HTML表單),然後解析HTML以提取所需的數據。我們要做的是查找適合初學者的教科書或在線教程,並花費十多天的時間,您可以對python的基礎知識有三到四點了解,這時候你可以玩玩爬蟲了!
  • 技術乾貨 | 如何做好文本關鍵詞提取?從三種算法說起
    既然是分類問題,就需要提供已經標註好的訓練預料,利用訓練語料訓練關鍵詞提取模型,根據模型對需要抽取關鍵詞的文檔進行關鍵詞抽取2半監督的關鍵詞提取算法只需要少量的訓練數據,利用這些訓練數據構建關鍵詞抽取模型,然後使用模型對新的文本進行關鍵詞提取,對於這些關鍵詞進行人工過濾,將過濾得到的關鍵詞加入訓練集,重新訓練模型。
  • Excel批量提取數據,快來試試這幾招
    在我們日常工作中,從表格中提取某些數據,也是經常的事。以前分享過利用快捷鍵【Ctrl+E】快速提取數據的方法(教程文末有連結)。這些低版本的怎麼批量提取呢?今天阿鍾老師就分別以快捷鍵、函數公式、功能按鈕為例講解如何快速提取數據。函數公式法新、舊版本通用。01.
  • Excel表格怎麼提取相同顏色的數據,Excel表格數據
    當我們在表格中統計數據時,總是習慣於將一些重要數據標紅,以便整個數據更直觀地顯示出重點。所以,如果我們需要從這些重要的數據中抽取這些紅色的,用什麼方法可以以最快的速度抽取所需的數據呢?讓我們一起去了解。
  • 「深度學習」從專利文本中提取化學反應——ChEMU數據集
    其實這些算法的本質都是基於統計學、概率學的數學模型,而數學模型離不開數據因此想要讓設計出來的模型更好地預測有機反應問題,就需要大量、且高質量的有機反應數據。那麼想要獲得充足的反應數據,一方面可以從不完全開源的Reaxys下載,但獲取數據會受到的各種限制;而同時也有一部分開源的數據集,例如USPTO 1976-2016[1],它們的問題是數據沒有更新與維護,數據質量參差不齊。
  • 2015Q1網頁遊戲數據報告
    一、運營平臺開服排行  點評:本季度最新網頁遊戲開服數據統計:一線平臺共開服50712
  • excel數據提取技巧:從混合文本中提取數字的萬能公式
    有沒有能把任何文本中包含的所有數字都提取出來的公式?當然是有的,今天就給大家帶來提取數字的萬能公式,不管數字在文本中的位置是否有規律,不管文本中數字有多少,它都能把數字提取出來。趕緊來看看吧!學習更多技巧,請收藏關注部落窩教育excel圖文教程。在上一篇文章中,小花講解了通過觀察混合文本特徵,設置特定公式,完成數據提取的三種情景。
  • 如何在業務中利用數據分析方式的技術指南?
    編輯導讀:我們每天產生大量的數據,如何從數據中分析和提取出有助於商業成功的信息,是企業取得成功的主要動力之一。本文作者將從自身經驗出發,分享如何分析數據,希望對你有幫助。當企業企業擁有大量數據時,如何從數據中分析和提取出有助於商業成功的信息,是企業取得成功的主要動力之一。
  • JavaScript基礎關於對象相關的必看詳解
    遠的不說在網頁或者app中 ,我們經常要註冊個人的登錄信息然後保存到資料庫中 ,下次在使用這個網頁或app都會有自動登錄或者驗證登錄 ,這些信息不能通過數組保存嗎?比如我們之前用數組保存一個人的信息:數組數組保存數據的缺點是:數據只能通過索引值訪問,開發者需要清晰的清除所有的數據的排行才能準確地獲取數據,而一個網頁往往有龐大的數據量需要開發者處理,不可能做到記憶所有數據的索引值
  • 如何利用數據可視化講好一個數據故事
    編輯導語:如今隨著科技的發展,數據可視化可以在工作中大大的提升工作效率,也能更好的理解指標;也可以用數據可視化的方式講故事,這種方式也能帶來很多好處;本文作者是關於如何利用數據可視化講數據故事的分享,我們一起來看一下。「數據的力量有多大?」
  • 3款好用又安全的電腦軟體,從圖片提取文字,簡直就是辦公神器
    1.天若OCR 這是今年讓比較欣喜的一款軟體,簡單點來說,它就是電腦版的識別工具,截取一張圖片,並且可以提取上面的文字。 對於不能複製文字的網頁,可以用它快速提取文字,並且還可以一鍵翻譯,真的是超級方便了。
  • 中國衛星遙感數據處理和信息提取的一場革命
    清華大學理學院院長、地球系統科學系主任宮鵬教授和清華大學博士研究生劉涵一起,對外發布了清華大學中國和全球地表覆蓋和土地利用製圖成果,令在線參加的多家權威媒體,以及親身參與此次項目合作的AWS(亞馬遜雲服務)和光環雲(光環雲數據有限公司)團隊,都無比興奮!本篇全文均引用宮教授和劉博士發言原文,因為在項目的合作中,光環雲深切感受到,沒有什麼語言比來自科學家團隊的原話更真實且有力量!
  • 假面騎士01:千騎劫取器套路深,無限提取數據,無限釋放「大招」
    在利用「滅亡迅雷」之後,他終於獲取了強大的數據鑰匙卡,就這樣假面騎士Thouser誕生。只不過假面騎士Thouser的目的是收購飛電集團,同時製造出強大的AI兵器。而這收購飛電集團就是第一步,因為假面騎士零一還在,如果不收購飛電集團,假面騎士零一始終是一個威脅。假面騎士Thouser使用的武器是「千騎劫取器」,這是千騎使用的強大武器。
  • DarwinML實現全自動數據特徵提取,AutoML技術助力票據識別領域技術...
    DarwinML實現全自動數據特徵提取,AutoML技術助力票據識別領域技術突破 來源:財訊網 • 2020-05-15 16:14:33
  • 數據挖掘實例:100美元挖來無價之寶
    本文作者講述了他們作為獨立工程師開展數據挖掘項目的過程,告訴我們運用各種免費或開源工具挖掘數據的成本很低,同時降低了我們想像中的難度,探索精神值得我們學習。今天各種強大的數據分析工具讓我們有能力分析以前想都不敢想的大企業或者大機構的數據。
  • 手把手教你如何創建「豐富網頁摘要」提高網站訪問量
    直白的說,豐富網頁摘要更具有視覺吸引力的搜索結果,在標題、描述和URL旁邊顯示更有價值的附加信息,這些信息主要來自頁面上的結構化數據。下圖為ahrefs網頁精選摘要的展示效果,其中「SERP中的回顧和常見問題」頁面展示了豐富網頁摘要效果。
  • Delmia機器人仿真編程 點焊仿真 第1節 焊點坐標數據提取
    在進行Delmia點焊項目仿真之前,如果焊點數量較多,則可以通過宏命令將焊點數據提取出來,保存為xls或者txt格式文件,仿真項目創建完成後再將焊點數據導入使用。當然如果焊點數量較少,則可以直接在仿真時創建焊點,以節省時間為目的。