Java爬蟲入門(一)——專案介紹

codingCoge發表於2018-08-06

前言:

這個系列我分四個部分來分別接觸四塊知識,最後再串起來:
Java爬蟲入門(一)——專案介紹
Java爬蟲入門(二)——HttpClient請求
Java爬蟲入門(三)——正規表示式
Java爬蟲入門(四)——執行緒池和連線池
Java爬蟲入門(五)——緩衝流寫入
GitHub地址:

https://github.com/jjc123/Java-Crawler/blob/master/README.md

突然心血來潮想學一下爬蟲,本來是打算學python的(學習成本不高),不過既然是搞java的,那就用java好啦,畢竟知識可以複用,而且java的爬蟲框架庫也不少。
這裡寫圖片描述
來看個圖解 ,相信對爬蟲一目瞭然:

於是開始了爬蟲填坑史
網上找了一些java爬蟲的資料:
Java使用HttpClient傳送Get和Post請求
零基礎寫Java知乎爬蟲之先拿百度首頁練練手
java爬蟲入門
爬蟲一般分三步:

1. 建立網路連線,爬取資料
2. 建立正規表示式規範
3. 使用正規表示式爬取獲得的資料

如果資料量比較龐大,可以選擇執行緒池,連線池併發。
先定個小目標吧 :

爬取一個小說網站的小說下載到本地

小說網址:

https://www.bookbao8.com/BookList-c_0-t_2-o_1.html

專案要求:
JAVA爬蟲 併發爬取靜態小說網站的全部小說
數量級過萬,理論上可行,不過測試的時候我就測試了100組而已。
涉及的知識:

1. HttpClient請求
2. 連線池併發
3. 執行緒池併發
4. 正規表示式
5. IO流儲存本地檔案

為什麼選擇爬取這一個靜態網頁呢? 因為:
對於剛入門的菜狗如我,就別想著爬知乎,百度,CSDN了。
因為我發現我爬的百度首頁都是看不懂的編碼格式,如:

.bdsug .bdsug-direct p{color:#00c;font-weight:700;line-height:34px;padding:0 8px;cursor:pointer;white-space:nowrap;overflow:hidden}
.bdsug .bdsug-direct p img{width:16px;height:16px;margin:7px 6px 9px 0;vertical-align:middle}
.bdsug .bdsug-direct p span{margin-left:8px}
.bdsug .bdsug-direct p i{font-size:12px;line-height:100%;font-style:normal;font-weight:400;color:#fff;background-color:#2b99ff;display:inline;text-align:center;padding:1px 5px;*padding:2px 5px 0;margin-left:8px;overflow:hidden}
.bdsug .bdsug-pcDirect{color:#000;font-size:14px;line-height:30px;height:30px;background-color:#f8f8f8}
.bdsug .bdsug-pc-direct-tip{position:absolute;right:15px;top:8px;width:55px;height:15px;display:block;background:url(https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/global/img/pc_direct_42d6311.png) no-repeat 0 0}
.bdsug li.bdsug-pcDirect-s{background-color:#f0f0f0}
.bdsug .bdsug-pcDirect-is{color:#000;font-size:14px;line-height:22px;background-color:#f8f8f8}
.bdsug .bdsug-pc-direct-tip-is{position:absolute;right:15px;top:3px;width:55px;height:15px;display:block;background:url(https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/global/img/pc_direct_42d6311.png) no-repeat 0 0}
.bdsug li.bdsug-pcDirect-is-s{background-color:#f0f0f0}
.bdsug .bdsug-pcDirect-s .bdsug-pc-direct-tip,.bdsug .bdsug-pcDirect-is-s .bdsug-pc-direct-tip-is{background-position:0 -15px}
.bdsug .bdsug-newicon{color:#929292;opacity:.7;font-size:12px;display:inline-block;line-height:22px;letter-spacing:2px}
.bdsug .bdsug-s .bdsug-newicon{opacity:1}
.bdsug .bdsug-newicon i{letter-spacing:0;font-style:normal}
.bdsug .bdsug-feedback-wrap{text-align:right;background:#fafafa;color:#666;height:25px;line-height:25px;display:none}

原因我總結了幾點:
網頁最終顯示的頁面原始碼是經過瀏覽器解釋後的,
你get或者post請求到的原始碼是伺服器直接返回的,不一樣是正常的。
最基礎的爬蟲只能爬取沒有動態載入的純靜態網頁,而目前主流的網站都是有反爬蟲的措施,以及各種驗證措施。就比如2017年知乎就已經改版了,爬蟲更加困難,之前的關於知乎的爬蟲專案也都是無效的,因為爬蟲模式不一樣的,也就是說更難了。
所以對於初學者來說,找一個簡單的純靜態頁面練手才是正道

1. 網頁採用ajax等動態互動模式 爬取的資訊可能只有一個div,  
   沒有內容,要經過瀏覽器動態載入後才會顯示本來面目
2. 網頁採用js等瀏覽器渲染模式,爬取的資訊都是看不懂的,  
   需要瀏覽器本身來解析成可看的內容
3. 登陸驗證:無法直接爬取網站資訊,需要模擬瀏覽器訪問網站才可
4. 同一個ip訪問一個網站頻率太高,被檢測出爬蟲,直接封殺,
   所以你得讓你的爬蟲sleep一下,比如模擬人的規律5分鐘爬取一次

相關文章