前些日子有則新聞,內容是房仲界有名的一個服務,因為可以讓使用者於其上搜尋十家房仲業者的不動產銷售資料,因而被房仲業者提告,最後被判決違反公平交易法而必須賠償。原因是,法院認為這些不動產銷售資料,是各房仲業者花費大幅心力所建置而成,而該搜尋服務憑藉著自動化的技術,輕易將這些資訊納入搜尋範圍內,並據以獲利。

當然,從網路上的公開網頁上擷取網頁內容,並提供搜尋服務的搜尋引擎,已經行之有年,但此案的內容,也和典型的搜尋引擎不盡相同。不過,在此並不討論法律的相關問題。從這個例子上,我們看到了,由於網路成了發布公開資訊的重要媒介,也因此,在網路已經匯集了大量,而且有用的資料,甚至像在這個新聞裡的例子,這些資訊足以構成商業價值,做為提供商業化服務的基礎。

再舉一個例子,像廣為人知的 g0v (零時政府)的諸多開放政府專案,即有不少專案利用自動化技術擷取各單位組織的公開網頁中資料,經過匯集、整理、分析之後,以好的視覺呈現方式讓使用者更便利的運用。

這類的服務都使用了自動化的網頁擷取技術,但和一般搜尋引擎所用的網頁擷取技術相比,又不盡相同。

搜尋引擎的網頁擷取,對上自動化網頁擷取

對於目前以提供文字搜尋、全文檢索做為主要用途的搜尋引擎來說,所使用的方式,是以所謂的「爬蟲(crawler)」架構為主。在這種架構下,每個爬蟲從固定的網頁起點出發,剖析網頁中所含的超連結(hyperlink),再分別沿著各個超連結到下一個網頁去。每造訪一個網頁,就擷取該網頁中的內容,並且儲存於搜尋引擎的資料庫中,以備之後的索引或各種進階處理之用。對一般的搜尋引擎來說,擷取的標的還是網頁中的內容,而且並不預設所「爬」到的網頁,會是什麼格式、裡頭會含有什麼樣的資料。

但像是從各房仲業者網站擷取的不動產銷售資料,或說從各機關組織擷取各式公開網頁中資料的 g0v開放政府專案,它們都是有目的性的。因為它們都是從事先選定的網站甚至是網頁中,依循固定的路徑或是模式,來擷取網頁中的資料。此外,更重要的是,對這類的服務來說,它們並不像搜尋引擎處理「非結構性」的資料,而是從不具結構的網頁資料中,進一步剖析出其中的結構性資料。

就拿房仲網站上的不動產銷售資料來說好了,因為資訊都是以網頁的方式來呈現,所以,自動化擷取程式所擷取到的,只是單純的網頁內容,一個網頁或許有十筆或是二十筆等數目的銷售資料。但是,只取回網頁對於後端的處理並沒有幫助,因此,必須透過一個剖析程式,將網頁中的每筆銷售資料予以剖析出來,就像是「銷售物件名稱」、「透天或公寓」、「地址」、「坪數」、「總價」、……等等資訊,如此一來,才可以將原始的網頁資料,轉換成為有著各欄位的結構性資料。

結合剖析程式,將擷取到的網頁資料轉換成結構化資料

只要能將所擷取到的網頁資料,經過剖析程式處理、成為結構性的欄位資料,就可以將資料儲存於資料庫中,並且做各式各樣的運用了。

例如,將資料儲存在關聯式資料庫之後,就可以輕易找出:所有在大安區坪數在30坪至50坪之間的公寓房子。透過自動化擷取的技術,可以將公開網頁上的資料,快速、大量地累積在自身的資料庫中。除了可做跨網站的整合之外(例如,跨了十家房仲業者的網站內容),還可以進一步做分析運算,產生新的加值。

所以說,剖析程式是此類自動化擷取程式的關鍵之一。因為每個網站的網頁結構都不同,怎麼從中將不需要的部份去除,只取出需要的部份,就是剖析程式的責任及工作。而且,每個要擷取資訊的網頁,通常都不會一樣的,也就需要分別對應不同剖析規則。

最原始的剖析程式,乃是直接將剖析的規則寫死在程式裡的。在這種方式下,為每個網站實作剖析規則的就是程式設計者了。程式設計者必須逐一針對每個網頁中的資訊,以撰寫程式的方式,來剖析出系統需要的欄位。

但這種作法有一些缺點。首先,是剖析規則僅能依靠程式設計者實現,其他人無法插手,但其實,網頁的剖析規則,往往沒有複雜到需要程式設計者來介入。其次,網頁中資訊的剖析規則很容易因為原網站前端的視覺改變,而連帶的使得網頁內容及剖析規則改變。只是因為規則改變,就必須重新修改程式、部署系統,顯得有點工程浩大。

正因為倘若以寫死在程式碼中的方式來實作剖析規則,會有上述提到的缺點,因此,有些人開始發展專門的網頁自動化擷取引擎。在這類的引擎裡,通常會包含一個剖析程式的引擎,使得剖析規則不再需要以撰寫程式碼的方式為之,而是可以透過程式之外的設定檔或是描述檔,來定義所要擷取的每個網站中的剖析規則。

不同的剖析程式引擎,做法不盡相同,但最終的共同目標,都是希望讓非程式專業的人士都能更易設定,同時提供更多的彈性,讓剖析程式的規則可以滿足更廣泛的需求。

剖析程式還可以搭配網頁擷取代理人引擎

除了剖析網頁,以擷取出網頁中的結構性資料之外,此類的系統還會需要描述擷取行為或說動線的引擎,簡單來說,可以想像成是描述一個機器人的行為,就稱它為「擷取代理人(Agent)」引擎吧。

大抵擷取資料,可能都需要經過幾個網頁的操作,才有可能得到最終的目標網頁。例如,先進入首頁、輸入查詢條件、送出表單、得到搜尋結果,然後點進搜尋結果,才會進到目標網頁。這時候,才能夠利用剖析程式來擷取出目標網頁中的資料。很多時候,甚至還會有翻頁的行為,因為搜尋結果太長,通常不會一次得到所有的結果。

我們可以想像:有個代理人,它會自動化地,依據我們所描述的規則,來進行上述的動作,因此,我們也必須要有個足以描述代理人行為的方式,它可能是個很高階的語言,或是任何一種描述的形式,甚至可能是個視覺化的描述方法。不論如何,其目的都是要讓人可以描述擷取網頁資訊的代理人,究竟要依循什麼樣的行為來執行工作。

隨著公開網頁上的資訊愈來愈多、愈來愈豐富,擷取網頁的自動化程式也愈來愈大行其道。甚至有些程式大量、密集的擷取一些特定網站上的資料,造成這些網站沉重的額外負擔,甚至是無法正常運作。因此,很多網站也開始陸續加上了一些機制來杜絕自動化擷取程式,像是透過複雜的JavaScript程式行為,使得代理人的行為描述引擎無法支援這些複雜的行為。有些網站甚至加上計時器,隨時偵測目前的「使用者」在切換網頁時的速度是否過快,甚至切換網頁時具有一定的規則。當發現異常的存取行為時,便直接封鎖來自於該 IP 位址的存取。

也有些網站乾脆加上了 Captcha 機制,要使用者輸入查詢條件時,必須一併輸入 Captcha ,而 Captcha 用程式的方式不好破解。像最早期的商業司供查詢公司基本資料的網站,就因為被各方密集大量的自動化存取不堪其擾,最後只好加上了 Captcha。

有些網站不願意加上 Captcha 來增加使用者操作的複雜度,便將關鍵的資料從文字轉換成圖形,雖然使用者看到的視覺結果還是文字,但是在網頁上卻是以圖檔來提供,這也會增加剖析程式的難度,逼剖析程式須透過 OCR 機制來取出這些關鍵資訊。

總之,在公開網站上揭露資訊,終究是會有被取走資料的可能。對於想揭露資訊的一方,是一定得揭露,以及想自動化擷取資訊的這一方,兩邊之間的技術鬥法肯定是永無止盡的。

作者簡介


Advertisement

更多 iThome相關內容