java 11 httpClient 簡介與爬蟲實作
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