第一次學習並嘗試分析、爬取一個網站的數據,所有是從零開始的經驗,但願對各位看官有幫助,固然,本次爬取的是一個比較簡單的網頁,沒有任何反爬蟲措施的網頁。json
網上查了一下Java爬數據,最原始的方式是用請求網頁的字符串而後用正則解析標籤,再查了一下有什麼爬蟲、解析網頁的工具,而後就查到了這個gecco,當是也沒多想,就是幹吧。segmentfault
主要參考了兩個博客:maven
一、入門到精通:https://segmentfault.com/a/1190000010086659工具
二、精通到放棄:https://blog.csdn.net/gf771115/article/details/53218022學習
最後附上官方地址:http://www.geccocrawler.com/網站
maven代碼:url
<!--gecco抓包工具--> <dependency> <groupId>com.geccocrawler</groupId> <artifactId>gecco</artifactId> <version>1.0.8</version> </dependency>
由於我是搞定了纔會過來寫博客的,因此就直奔主題,說明我主要要作什麼了。spa
網站是:https://doutushe.com/portal/index/index.net
(站主要是看到了,請聯繫我刪除,沒看到的話,嘿嘿,我就不厚道的繼續放着了)code
通過觀察,分頁以後的格式是:https://doutushe.com/portal/index/index/p/1(沒錯,這個1就是對應頁數)
頁面大概是這樣的:
而後每個帖子的詳情:https://doutushe.com/portal/article/index/id/XR5(最後的XR5是帖子id)
頁面是這樣的:
個人任務很簡單,就是把列表的全部的帖子的標題、全部的圖片,這兩個數據爬下來
一、訪問第1頁
二、讀取第一頁的帖子列表,而後進入每個帖子的帖子詳情,將標題、圖片列表的數據拿出來
三、訪問下一頁,而後遍歷帖子列表拿數據,一直循環,直到沒有下一頁
廢話:按照我作的時候,我解析第一頁的時候,是先解析列表信息,最後纔開始研究怎麼解析出來哪一個是下一頁,如今是回過來寫的,因此就一步到位了,直接解析第一頁的列表信息和下一頁的鏈接地址
大概意思是主要gecco爬了這個https://doutushe.com/portal/index/index/p/格式的網址,就會交給DuotusheIndex這個類來解析,後面這個popelines則是解析出來的結果傳送到另一個類作下一步處理,這個popelines算是一個標識,以後就會發現玄機。
咱們經過頁面的審查元素,能夠看到列表的標籤信息(以下圖),咱們所要的信息,基本上所有包含在這個class爲link-2的a標籤裏面:
因此我分爲兩個List<String>用來分別保存列表的名稱和詳情頁面的連接,即a標籤的內容和a標籤的href值,因此獲得的解析爲下圖:
這裏須要再次提醒的是,@Href註解不能單獨使用,必須用@HtmlField定位到對應的地方,而後再在上方加上@Href標籤才能拿到href的值,不然拿到的就是a標籤的值,其餘的註解用法,能夠直接查看gecco官網的「使用手冊」,吐槽一些,寫得好簡單,只有說明沒有示例,有時候不太明白他的意思,又沒有例子能夠參考,蛋蛋的憂傷。
而後接着也須要將下一頁的地址給解析出來,給分頁審查元素的時候,獲得下圖:
我沒有找到只解析後面一個或者是根據標籤內容過濾的方法,因此我只能是用最原始的辦法,就是將全部的分頁連接都解析出來。因此就涉及到了另一個東西,前面是解析單個內容,此次解析的話,除了解析分頁的鏈接,我還須要頁數,以斷定是不是下一頁,因此須要解析的是一個對象。
這東西跟json是一個道理,我要將一個東西直接解析爲一個對象的時候,首先要將整個對象的數據拿下來,而後再把這串數據解析爲對象。看上面的圖,ul標籤的li標籤就是一個對象的數據,因此咱們就將一個個li定位出來,也就有了下圖的解析(IndexPageEntity是頁數的對象)(建議第一次的時候,將IndexPageEntity改爲String,看看輸出了什麼):
接着是IndexPageEntity:
由於a裏面已經包含了咱們所要的信息,因此咱們將a標籤解析爲咱們須要的數據格式就能夠了。
最後附上DoutusheIndex類的詳細內容(省略get set方法,注:代碼中必需要有)
這個類就是前面提到的須要用到popelines的,這個類主要的做用就是等待DoutusheIndex類解析好了網頁的內容以後,跳到這一個類來處理下一步的信息,好比我這裏以下圖這樣寫:
而後獲得的輸出結果是(我沒有打印名稱列表):
咱們須要的信息已經打印出來了,因此咱們須要完善咱們的邏輯。
第一頁的數據咱們其實不須要保存的,詳情頁的數據纔是咱們須要的,因此第一頁的數據解析出來以後,就要執行咱們的兩個邏輯了:一、遍歷列表(打開列表的每個詳情頁)二、跳到下一頁
因此咱們改一下FinishDoutusheIndex就能夠了,修改以後以下:
注:咱們作好相關網頁解析就好,若是訪問了這個網頁,url匹配的上的話,會調起解析程序,因此這裏遍歷的放心大膽的訪問鏈接就能夠了,不須要其餘操做。
解析帖子詳情,並對咱們索須要的數據進行處理,該說的上面都說了,這裏直接貼代碼就行了。
最後輸出的結果,隨便貼一點: