java 11 httpClient 簡介與爬蟲實作

周冠甫 2020/12/30 10:13:35
102

Java 9 中新增的標準化 Http Client API,在經過了兩個版本的更新與優化,終於在 Java 11大致完成了。

在Java 11 中,經過大幅改寫的Http Client API,package名稱由 jdk.incubator.http 改為 java.net.http,該API通過CompleteableFutures提供非阻塞請求和響應語義,完全支援非同步發送請求,可以聯合使用以觸發相應的動作。

新的Http Client API提供了對HTTP/2的支援,同時向下相容HTTP/1.1,容易實作的語法與主流開源API(如:Apache HttpClient、Jetty、OkHttp 等)類似甚至性能更高。並且使用上差異不大,讓開發者更好上手。

對比一下Apache HttpClient與java.net.http使用上差異:

Apache HttpClient

Http Client API

可以發現實作上差異不大,讓開發者更好上手。

 

 

一些基本的API使用:

 

設定 HTTP Protocol Version

 

設定 Header

 

設定 Timeout時間

 

多種資料格式發送POST Request

1. String

json格式

 

2.File

3. ByteArray

 

支援同步與非同步

 

同步

非同步

 

爬蟲實作:

上面介紹了如何使用API對網站進行請求並取得Response,

那麼我們要怎麼解析Res取得我們想要的資料呢?

這部分我利用Jsoup來進行解析,此libaray提供多種方法能取得html物件進行操作,

依照想Parser的網站結構進行設計,即可取得想到的資訊。

 

簡介Jsoup的功能:

  • 可以從URL,文件或字符串中刮取並解析HTML
  • 查找和提取數據,使用DOM遍歷或CSS選擇器
  • 操縱HTML元素,屬性和文本
  • 根據安全的白名單清理用戶提交的內容,以防止XSS攻擊
  • 輸出整潔的HTML

此次Parser的網站架構及網址:

https://twcoupon.com/brandshop-%e9%ba%a5%e7%95%b6%e5%8b%9e-%e9%9b%bb%e8%a9%b1-%e5%9c%b0%e5%9d%80.html

 

實作解析邏輯:

執行結果:

偽裝:

如果想parser的網站有防爬蟲的設定怎麼辦呢?

大多數爬蟲被識別的原因是短時間request太多次,可先降低發送request的次數或延長間隔,

另外也可利用設定proxy以及模擬瀏覽器進行偽裝。

設定Proxy

模擬瀏覽器

不過現在很多網頁因為安全性限制所以不提供 http 的讀取 ,需要改用 HttpsReader 來抓 https 資料,

有興趣的同學可以前往參考資料最後一項,有相關實作可供參考。

 

最後:

這次介紹的僅止於網頁靜態的parser,再進階可以搭配selenium使用,

就可以踏足網站的更深處擷取資料囉。

 

 

參考資料:

https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html

https://www.itread01.com/content/1558576864.html

https://jsoup.org/

https://medium.com/phelps-laboratory/parsing-company-name-and-id-by-java-e77efc75e584

 

 

周冠甫