使用Jsoup庫編寫java爬蟲
Jsoup庫能幹什麼?
- 從URL,文件或字符串中刮取並解析HTML
- 查找和提取數據,使用DOM遍歷或CSS選擇器
- 操縱HTML元素,屬性和文本
- 根據安全的白名單清理用戶提交的內容,以防止XSS攻擊
- 輸出整潔的HTML
Jsoup庫是可以用於防止用戶進行XSS的,但是本文主要講爬蟲相關,所以會跳過具體防止XSS攻擊的代碼
Java類似的網絡請求庫
- java.net.URL Java自帶的url鏈接庫,簡單的網頁訪問獲取是沒有問題的
- org.apache.http.client 裏面的方法比Jsoup全,但是Jsoup比較輕量化
- com.squareup.okhttp…
至於爲什麼選擇Jsoup: Java是有很多網絡請求庫的,寫爬蟲就是獲取到別人網站的內容,然而到底選擇哪個庫的重要程度往往沒有"懂得如何繞過防爬"這個思想重要的…但是本文屬於如何編寫簡單的爬蟲,所以選擇的就是比較輕量級,容易入手的剛需型庫
Jsoup庫的常用命令
Jsoup真的很輕量級,他在入手的時候只需要瞭解他的入口命令就行了.然後從他的入口命令進行擴展就可以寫出成熟的爬蟲了:)
String res = Jsoup.connect(url)//get
.header(headers)//這裏存放的可以是map也可以直接headers("user-agent","ua")
.timeout(5000)
.get()
.toString();
String res = Jsoup.connect(url)//post
.requestBody(json)
.ignoreContentType(true)
.cookie("toekn","gbfdlkglkdsflkdngdffxcv13")
.post()
.body()
.text();
這就是簡單的獲取到url的html了.然而爬蟲要做的是對其進行篩選.這裏有一個方便的方法,大家在用idea裏面這個命令的時候,在入口方法 connect後面按一下提示,後面就是他的常用方法了.大家看一遍之後大概也能找到自己想用的功能.
從connect命令我們可以擴展到比較常用的(get/post/body/execute/timeout/cookie)
get
直接獲取html.返回Docment類型,可以對返回值進行html解析.
Document res = Jsoup.connect(url).get();//根據實際情況,添加header與timeout
Element content = res .getElementById("text");//獲取id爲text的Element
Elements links = content.getElementsByTag("a");//獲取所有a標籤的Element,返回值可以直接foreach處理
post
get可以實現的post也可以實現,不過post要注意的是:post傳值是通過"data"或者"requestBody"傳的,直接看代碼
Document doc = Jsoup.connect(url)//1.普通傳參是鍵值對
.data("param", "1")
.post();
Document doc = Jsoup.connect(url)//另類就是json了
.requestBody(json)//json的字符串String
.post();
body/toString
如果是希望通過正則解析網站的話,可以直接在get/post之後加上".body"或者"toString()"方法.返回的就是html的字符串類型.
萬能正則表達式可以看下我的這篇 萬能正則公式 獲取兩個字符串之間的字符串 適應大多數場景
execute
如果返回的是json建議用execute() 去執行.如果用get 去執行的話,返回來是一個 HTML 頁面包裹的json.那挺麻煩的了
ignoreContentType
顧名思義 無視請求類型,如果你的Jsoup報錯了,裏面有concent type 相關的字眼,無腦加上這個方法就會完美解決了.
timeout
在任何地方編寫的爬蟲,都會出現timeout的報錯,這個時候你可以選擇:
- 延長超時的時間設置timeout(60),一分鐘超時
- 自己造個輪子,timeout(5),超時後重試,設定重試次數
Integer retry = 2;//設定重試次數
Integer delay = 5;//設定重試等待時間
for(i=0;i<retry;i++){
try{
//Jsoup連接代碼.....timeout(5)
}catch{
sleep(delay)//等待X秒
}
}
cookies
部分網站會採取cookie的形式對訪問者進行各種限制.
在編寫爬蟲的過程中,我們一般不會手動獲取cookie,這太傻了.當然如果你的對手是淘寶,當我沒說
cookie獲取的場景有兩種:
- 一般第一次get網站的時候會自動返回cookie.你用map將他保存起來,下次訪問的時候傳回去就行
- js生成的cookie,這種需要根據實際情況,逆向或者重現js進行破解了
我們玩比較簡單的,第一種場景
Map<String, String> cookies = null;
Response res = Jsoup.connect(url)//初次訪問
.timeout(30000)
.execute();
cookies = res.cookies();
Response res2 = Jsoup.connect(url2)//訪問需要cookie的地方那個
.timeout(30000)
.cookies(cookies)
.execute();
}
就是那麼簡單.就是那麼輕量.寫你的爬蟲吧 886