這段時間工作比較空閒,在網上找資料學習的時候看到數據抓取這一塊,來了興趣
用jsoup實現數據抓取著實方便,唯一美中不足的是官方API是英文版的,對我這樣英語水平不好的程序員來說著實困擾,只能一點點的去實踐
所以有了這篇隨記,以後用的時候好回頭溫習溫習
Jsoup的一系列解析html操作是基於Document這個實例對象的,實例化方式有很多種,通過url,通過文件,通過字符串。
這裡我用的是url的方式,用來解析一個網站上的某些內容
eg:
Document doc = Jsoup.connect(url).get();
這個是官方提供的實例化方法,然而我使用的時候控制台報錯
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=XXX
後來網上找了一下原因:
有些網站的服務器在響應http請求的時候,需要客戶端提交的信息比較完善,而在Jsoup的Connection類中這個Header就是完善請求信息用的。
我們的浏覽器在請求網頁的時候會在請求的頭部head中發送一些數據,比如浏覽器類型,版本,語言等等。當我們用Jsoup去完成請求網頁的工作時,最好也要完善請求包頭信息,完成這個工作的就是header方法。
在實例化的時候加上
Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get();
就能解決這個報錯問題
doc操作方法,大部分跟JavaScript中的差不多,見名知意
getElementsByTag() : 獲取某個節點
getElementsByClass() : 獲取某個class中的節點
getElementById() : 獲取某個id中的節點
等等
通過這些方法返回的是Element對象
通過Element對象可以繼續往下操作
children() : 獲取子節點,這個我試過,獲取到的只是第一個子節點
text() : 獲取文本
attr() : 獲取該節點的屬性值
放上一段代碼片:
Document docu = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get();
Elements ele = docu.getElementsByClass("text"); //獲取class為text的節點內容
for(Element e : ele){ //循環
Elements uurl = e.children();
String t = uurl.text(); //獲取標題
String hr = uurl.attr("href"); //獲取鏈接
Document docum = Jsoup.connect(hr).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get(); //根據上一步獲取的鏈接,執行解析該鏈接的html
Element elem = docum.getElementById("contentText");
Elements elems = elem.getElementsByTag("p");
String text = elems.text(); //獲取內容
}
代碼片段是用來抓取某網站的數據