介紹
爲了演示Hutool-http的http請求功能,因此這個栗子用紅薯家的開源資訊開刀,在此做個簡單的Demo。
開始
分析頁面
- 打開紅薯家的主頁,我們找到最顯眼的開源資訊模塊,然後點擊“更多”,打開“開源資訊”板塊。
- 打開F12調試器,點擊快捷鍵F12打開Chrome的調試器,點擊“Network”選項卡,然後在頁面上點擊“全部資訊”。
- 由於紅薯家的列表頁是通過下拉翻頁的,因此下拉到底部會觸發第二頁的加載,此時我們下拉到底部,然後觀察調試器中是否有新的請求出現。如圖,我們發現第二個請求是列表頁的第二頁。
- 我們打開這個請求地址,可以看到純純的內容。紅框所指地址爲第二頁的內容,很明顯p參數代表了頁碼page。
- 我們右鍵點擊後查看源碼,可以看到源碼。
- 找到標題部門的HTML源碼,然後搜索這個包圍這個標題的HTML部分,看是否可以定位標題。
至此分析完畢,我們拿到了列表頁的地址,也拿到了可以定位標題的相關字符(在後面用正則提取標題用),就可以開始使用Hutool編碼了。
模擬Http請求爬取頁面
使用Hutool-http配合ReUtil請求並提取頁面內容非常簡單,代碼如下:
//請求列表頁
String listContent = HttpUtil.get("http://www.oschina.net/action/ajax/get_more_news_list?newsType=&p=2");
//使用正則獲取所有標題
List<String> titles = ReUtil.findAll("<span class=\"text-ellipsis\">(.*?)</span>", listContent, 1);
for (String title : titles) {
//打印標題
Console.log(title);
}
抓取結果爲:
其實核心就前兩行代碼,第一行請求頁面內容,第二行正則定位所有標題行並提取標題部分。
這裏我解釋下正則部分:ReUtil.findAll方法用於查找所有匹配正則表達式的內容部分,第二個參數1表示提取第一個括號(分組)中的內容,0表示提取所有正則匹配到的內容。這個方法可以看下core模塊中ReUtil章節瞭解詳情。
<span class=\"text-ellipsis\">(.*?)</span>
這個正則就是我們上面分析頁面源碼後得到的正則,其中(.*?)
表示我們需要的內容,.
表示任意字符,*
表示0個或多個,?
表示最短匹配,整個正則的意思就是。,以<span class=\"text-ellipsis\">
開頭,</span>
結尾的中間所有字符,中間的字符要達到最短。?
的作用其實就是將範圍限制到最小,不然</span>
很可能匹配到後面去了。
關於正則表達式這塊可以看下我的博客:正則表達式簡明參考
結語
不得不說,抓取本身並不困難,尤其配合Hutool會讓這項工作變得更加簡單快速,而其中的難點便是分析頁面和定位我們需要的內容。
真正的內容抓取分爲連個部分:
- 找到列表頁(很多網站都沒有一個總的列表頁)
- 請求列表頁,獲取詳情頁地址
- 請求詳情頁並使用正則匹配我們需要的內容
- 入庫或將內容保存爲文件
而且在抓取過程中我們也會遇到各種問題,包括但不限於:
- 封IP
- 對請求Header有特殊要求
- 對Cookie有特殊要求
- 驗證碼
這些問題都有一些解決辦法,具體要在具體的開發中分析解決。
希望大家看到這個栗子有所啓發,也爲Hutool提供更多更好的意見~