Java爬蟲技術之Jsoup

Java的應用領域一直給人的印象就是企業級系統開發語言,其實Java在爬蟲方面也是很強的,也有很成熟的生態體系,而且強大的語言基礎不論是爬取處理,數據處理都可以有足夠的支撐。很早讀書的時候,有看過一本爬蟲的書,當時並沒有堅持讀完,如今工作時間不是很充足,對相關框架、技術做一些關鍵記錄。

一、Jsoup簡介

1.官網

https://jsoup.org

2.功能說明

在爬蟲程序中,Jsoup作爲HTML解析器,爬取可以使用HttpClient等框架,Jsoup本身也支持發起常見請求,支持HTTP、HTTPS等,但對此的支持不夠豐富,可應付日常場景。
Jsoup可以從文本、文件、url獲取HTML頁面,生成文檔Document對象,並提供類似Jquery的操作方法,CSS選擇器的select元素查找方式,對HTML可以進行各種靈活的解析操作。熟悉HTML及Jquery的有經驗的開發人員可以非常快的上手。

二、Jsoup實操

1.操作案例

  1. maven依賴
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>
  1. parse字符串獲取HTML的方式
String html = "<html><body>test</body></html>";
Document document = Jsoup.parse(html);
  1. 通過URL發起請求獲取HTML的方式(GET請求)
//網絡請求一般要設置超時時間,防止程序無限制等待,這種情況在多線程很容易出現阻塞
Document document = Jsoup.connect("https://www.baidu.com")
        .timeout(1000)
        .get();
System.out.println(document.toString());
  1. 向API地址發起POST請求(POST請求)
Connection connection = Jsoup.connect("http://192.168.1.1:8080/api")
        .header("Accept", "*/*")
        .header("Accept-Language", "zh-CN,zh;q=0.9")
        .header("Connection", "keep-alive")
        .header("Content-Type", "application/x-www-form-urlencoded")
        .header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36")
        .timeout(3000)
        .method(Connection.Method.POST)
        .ignoreContentType(true);
Map<String, String> params = new HashMap<>();
params.put("param1", "1");
params.put("param2", "2");
connection.requestBody(JSON.toJSONString(params));
connection.execute();
  1. HTML解析操作·方法操作(類似Jquery)
Elements elements = document.getElementsByTag("body");

其他get方法,類似Jquery,根據名字即可知道作用,如圖所示:
方法列表截圖
6. HTML解析操作·CSS選擇器

Element element = elements.select("p[align='center']").first();
System.out.println(element.html());

CSS選擇器可參考W3School的CSS選擇器參考文檔:
https://www.w3school.com.cn/cssref/css_selectors.ASP

2.利用Jsoup進行文件下載(網絡資源爬取)

最初爬取文件時用了很多種方案,因爲文件比較大,也出了很多問題,比如利用commons-io包IoUtils進行文件下載,多線程情況下如果遇到資源問題或者網絡原因很容易引起線程阻塞,因此想到需要設置超時時間,這時候就想到了Jsoup本身,但是Jsoup默認只支持1M內文件下載,超過的需要設置maxBodySize,另外,超時時間很重要,根據程序執行情況、網絡情況綜合考慮設置。
使用Jsoup案例如下:

Connection.Response response = Jsoup.connect(url)
        .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36")
        .cookies(cookieMap)
        .maxBodySize(30000000)
        .timeout(60 * 1000)
        .ignoreContentType(true)
        .execute();
byte[] dataArray = response.bodyAsBytes();

獲取到byteArray後就可以繼續利用commons-io下的方法直接寫入文件,非常方便。
另外還有一種方式,可以獲取到輸入緩衝流:

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