使用Hutool爬取開源中國的開源資訊 原 薦

介紹

爲了演示Hutool-http的http請求功能,因此這個栗子用紅薯家的開源資訊開刀,在此做個簡單的Demo。

開始

分析頁面

  1. 打開紅薯家的主頁,我們找到最顯眼的開源資訊模塊,然後點擊“更多”,打開“開源資訊”板塊。

  1. 打開F12調試器,點擊快捷鍵F12打開Chrome的調試器,點擊“Network”選項卡,然後在頁面上點擊“全部資訊”。

  1. 由於紅薯家的列表頁是通過下拉翻頁的,因此下拉到底部會觸發第二頁的加載,此時我們下拉到底部,然後觀察調試器中是否有新的請求出現。如圖,我們發現第二個請求是列表頁的第二頁。

  1. 我們打開這個請求地址,可以看到純純的內容。紅框所指地址爲第二頁的內容,很明顯p參數代表了頁碼page。

  1. 我們右鍵點擊後查看源碼,可以看到源碼。

  1. 找到標題部門的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提供更多更好的意見~

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