標籤:官方 use 控制台 api 程式 except 等等 pst script
這段時間工作比較空閑,在網上找資料學習的時候看到資料抓取這一塊,來了興趣
用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(); //擷取內容
}
程式碼片段是用來抓取某網站的資料
Jsoup使用隨記