Jsoup存在的時間已經很長,曆史可以追溯到2010年的青蔥歲月。說起來,那時的java工程師們還是神一般的存在,那會我們自己搞工具,自己搞架構,唯獨缺少了開源精神。好些比較好用的工具都湮滅在原公司的資料庫中。
Jsoup這個工具的活躍度還不錯,對有一定開發經驗的人來說,入門還是很容易的。它對前端的css選擇器知識有一定要求,這個網上搜尋一下,很快也就掌握了。
下面我爬取了中工網的一些資訊,作為測試。
Document page_entrance= Jsoup.connect("http://www.workercn.cn/xuexi/").timeout(30000).get();
Element nav=page_entrance.getElementById("nav");
Elements a_targets=nav.select("a");
hrefs=a_targets.eachAttr("href");
有一點,不夠人性化的設計是,對于404或者503這類的響應碼,Jsoup都是通過異常的形式抛出,再編碼的時候,異常的捕獲需要着重處理。
try {
content_list = Jsoup.connect(cur_href).timeout(30000).get();
} catch (HttpStatusException e){
int code=e.getStatusCode();
writer.write(code+"_[ "+cur_href+" ]\r\n");
}catch (ConnectException e){
writer.write("連結異常_[ "+cur_href+" ]\r\n");
}catch (SocketTimeoutException e){
writer.write("通路逾時_[ "+cur_href+" ]\r\n");
}catch (Exception e){
writer.write(e.getMessage());
}
通過異常捕獲記錄一些資訊,比如,檢測網站上的無效連結。
另外,還有一點值得注意。借用Jsoup與某些接口進行互動時,post請求很多時候需要忽略内容類型,否則可能出現UnsupportedMimeTypeException.下面是在某功能中使用Jsoup 向百度站長進行連結送出的實作。
Document document=Jsoup.connect("http://data.zz.baidu.com/urls?site=www.workercn.cn&token=*********").ignoreContentType(true).requestBody(toBd.toString()).header("Content-Type", "application/json").post();
System.out.println(document.body());
在請求體的時候,可以參考如下:
//構造字元串,以\r\n進行不同連結的間隔區分
toBd.append(toBidu.get(i)+"\r\n");