天天看點

java網絡爬蟲開發筆記

步驟:

0. 從一個/多個起始頁面開始

1. 檢查網頁是否已經被爬過(mysql + connector-j)

2. 拉取網頁内容(jsoup)

3. 解析網頁,尋找其中的<a>标簽(jsoup)

4. 将href屬性中的内容作為壓入隊列

5. 跳轉到1

技術棧(真的稱得上什麼技術棧嗎)

1. jsoup處理http/https請求,并且解析網頁元素

2. mysql做url連結去重(其實很原始)

初次涉足網絡爬蟲,主要也是看知乎上面天天吹python爬蟲心癢癢,就選用了自己擅長的java來做。作為入門大緻參考了文章:How to make a web crawler using Java?(話說這篇教程裡面的代碼還寫錯了,DB.java裡面的finalize()寫的是 if (conn != null || !conn.isClosed()),當conn真的是null的時候會報NullPointerException,也不知道作者是不是很久沒碰java了)

實驗1:從www.mit.edu出發,尋找在mit.edu域下的、含有“research”的頁面。

初版代碼照着教程直接打,沒什麼花樣,不貼了。結果他Main.java這裡processPage()下Jsoup.connect(url).get()這裡沒有try/catch塊,碰到網絡錯誤/連結爆炸直接報錯,程式就停了,也是MDZZ。由于國内網速捉急,進度很慢,爬了一個多小時,總共才爬了1533個頁面,平均一秒一個都不到(也是醉),找到的帶有"reseach"的頁面也很多(廢話),就不貼出來了。

實驗2:從首頁 - 張鑫旭出發,扒zhangxinxu.com域下的所有頁面,并輸出到檔案。

代碼上主要就是去耦合了一點點,修正一些bug,把扒到的頁面輸出到一個output.txt,隻有jsoup碰到的毛病才輸到控制台(System.err),結果發現中文連結jsoup總是通路失敗。稍微探索了一下,發現主要問題出在jsoup會把http重定向中Header裡的Location的值重新urlEncode,就比如說我給他一個http://example.com/%12%34,然後它傳回 301,Location是http://example.com/%12%34/,本應該繼續跳轉到http://example.com/%12%34/,結果jsoup會去通路http://www.example.com/%2512%2534(因為%被encode成%25),然後就404了。這個坑挺大,一時半會兒解決不了,換下一篇文章再說吧。

總結,java實作網絡爬蟲day1。