本節我將向大家介紹一下YayCrawler的核心-頁面的抽取規則定義,這也是YayCrawler能夠做到通用的主要原因之一。如果我要爬去不同的網站的數據,盡管他們的網站采用的開發技術不同、頁面的結構不同,但是我只要針對不同的網站定義不同的抽取規則即可,不用再對每個網站專門開發一個爬蟲。
首先讓我來解釋幾個概念:
一、頁面(Page)
這里說的頁面不是指在瀏覽器上能直接看到的頁面,而是指一個http請求發送后服務端返回的response中的內容。它大多數情況是一個html文檔,也可能是一個Json字符串,甚至是自定義的字符串和二進制等。
二、區域(Region)
頁面上的一個或多個感興趣的代碼片段,比如某些div,某個表格,包含某個class的dom元素,Json數據中的某個節點,甚至某一段字符串。區域是規則解析的單元,一個Page可以有多個Region,每個Region在執行規則解析后會產生兩類數據:字段數據和子鏈接。字段數據會被持久化到數據庫,子鏈接會發送給Master加入待執行隊列。
上圖中,我如果用css選擇器選取class為list-con的元素會選擇到多個div,我們認為這就是一個類型的區域,叫做區域1;如果我用css選擇器選擇id為page的元素會選擇到分頁控件所在的div,我們認為這是區域2。
對於區域1,我可以通過xpath或者正則表達式來抽取樓盤地址、申報公示價格區間等字段數據,我也可以抽取“戶棟詳情”這個鏈接加入到任務隊列中。
對於區域2,我並不關心它的字段數據,我只關心下一頁的鏈接是什么,因此我只要配置一個子鏈接規則把下一頁的鏈接抽取出來即可。
三、解析規則
我們的解析是以區域(Region)為單位的(您可以把整個Page當成一個Region),前面說過一個Region解析完成后會產生兩類數據:字段數據和子鏈接。因此我們框架中存在兩種規則:字段規則和鏈接規則。字段規則描述的是如何從Region片段中抽取所需的字段數據;鏈接規則則描述的是如何從Region片段中抽取子鏈接。舉例說明:
上圖中我們針對基本信息這個區域設定了幾個字段抽取規則,我們來看看測試結果: