使用Jsoup庫編寫Java爬蟲 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的報錯,這個時候你可以選擇:

  1. 延長超時的時間設置timeout(60),一分鐘超時
  2. 自己造個輪子,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獲取的場景有兩種:

  1. 一般第一次get網站的時候會自動返回cookie.你用map將他保存起來,下次訪問的時候傳回去就行
  2. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章