起因
最近突然發了羊癲瘋,對爬蟲十分感興趣,開始想寫幾個爬蟲練練手,於是,洗手開搞。
像我這種懶人,對爬蟲了解個大概之后就開始偷懶了,開始找框架了,Google關鍵字“Java 爬蟲”,第一個搜索結果就是
高票回答推薦的幾款爬蟲框架:nutch、Heritrix、crawler4j、WebCollector和WebMagic,果斷選擇了WebMagic,支持國人作品嘛(肯定是中文文檔啊)
下手
使用Maven添加框架到項目中,在poxm.xml文件中添加以下依賴。國內的Maven庫居然沒有WebMagic,淚奔,頂着延遲添加了依賴。
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.5.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.5.3</version> </dependency>
依賴添加成功如下圖所示:
直接從開發文檔的例子入手,主要是有三個部分:
- 抓取網站的相關配置
- 抽取頁面信息的方法
- 發現后續url地址
WebMagic提供了一個Site類用於設置抓取網站的相關屬性,例如,設置失敗時重試次數為3次,抓取間隔為1秒的代碼如下所示:
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
抽取頁面信息的方法
WebMagic通過重寫PageProcessor的process()方法來實現爬蟲的基本邏輯功能。
WebMagic提供了四種用於抽取數據的方法:
對於HTML內容來說,可以通過XPath、CSS選擇器和正則表達式這三種方法抽取內容;對於JSON格式的數據可以通過JsonPath方法抽取內容。
下面是抽取內容的API表:
方法 | 說明 | 示例 |
---|---|---|
xpath(String xpath) | 使用XPath選擇 | html.xpath("//div[@class='title']") |
$(String selector) | 使用Css選擇器選擇 | html.$("div.title") |
$(String selector,String attr) | 使用Css選擇器選擇 | html.$("div.title","text") |
css(String selector) | 功能同$(),使用Css選擇器選擇 | html.css("div.title") |
links() | 選擇所有鏈接 | html.links() |
regex(String regex) | 使用正則表達式抽取 | html.regex("\<div\>(.*?)\") |
regex(String regex,int group) | 使用正則表達式抽取,並指定捕獲組 | html.regex("\<div\>(.*?)\",1) |
replace(String regex, String replacement) | 替換內容 | html.replace("\","") |
發現后續url地址
一個站點的頁面是非常多的,那么我們怎么在發現並抽取了一個頁面之后進行鏈式的挖掘呢?這事爬蟲程序非常關鍵的部分,對鏈式
答案是通過正則表達式構造待挖掘的url格式,調用page對象(不是頁面對象page,是process()方法提供的參數對象page)的addtargetRequests()方法,將url添加到待挖掘的url中。