Java抓取網頁數據

http://ayang1588.github.io/blog/2013/04/08/catchdata/

最近處於離職狀態,正趕清閒,開始着手自己的畢業設計,課題定的是JavaWeb購物平臺,打算用SpringMVC+MyBatis實現,打算添加緩存服務器,用什麼還沒有想好,依賴用Maven管理,數據庫用MySql,IDE就用InetllijIDEA。


  購物平臺業務都差不多,平時經常使用,業務大家都比較熟悉,我打算模擬噹噹網,所以昨天直接把數據庫設計好,並建了起來,今天打算準備數據,可是product表和book表的字段稍微有點多,如果上網一個一個的摘錄,肯定是不行事兒的,也不是coder做的事兒,要準備多的數據,又是重複的事兒,何不讓計算機幫你幹。所以打算用Java程序抓取現噹噹網的數據,提取自己想要的,並直接存入數據庫。經過一下午的努力基本實現了功能,由於分類並不打算和噹噹網的分類一樣那麼多,所以實現了符合自己的半自動化數據抓取功能。可以實現輸入噹噹網的類別(category_path),和起始結束頁,自動填充數據庫中對應對象。
  最開始用的正則匹配抓取內容,後來發現太麻煩了,正則左一斜槓右一斜槓的,又轉義又拼接,一會就暈了,所以放棄了,改爲像操作Dom樹一樣進行抓取,用到的開源包Jsoup文檔),也支持像CSS過濾器一樣過濾節點,很方便。但是這樣並不支持獲取js及ajax訪問返回數據後的頁面,但用htmlunit可以解決這個問題,htmlunit:傳說中Java程序員的瀏覽器,具體使用不太難,就是模擬瀏覽器,設置好相關屬性就可以開始訪問了。這裏有一篇淘寶關於定向抓取的介紹,大家可以看看(定向抓取漫談)。
  以下是我訪問當當數據的類(其餘的就不貼了,數據庫存儲用的最原始的JDBC,沒什麼好說的,這個只是隨便寫個大概,夠自己用了,其實完全可以拓展成通用的工具類,我就不封裝了,本來就挺方便的,直接用也就夠了),如果哪裏有問題請記得及時給我留言

複製代碼
1publicclassUtils{23//UrlVo類存放了3個url,列表圖片url,詳細信息中的圖片url,和商品詳細信息url4//再通過這三個url可以把所有數據讀取出來並封裝成對象,然後存入數據庫。5//同時將所用到的圖片下載到本地。67/**8*從一個頁面獲取該頁面商品詳細信息的url鏈接和小圖片的鏈接地址9*@paramurl10*@return11*@throws12*/13publicstaticvoid getBookUrlFromPage(String url, List list) throwsException{14//timeout0:不斷請求默認:2000毫秒超時15         Document document = Jsoup.connect(url).timeout(0).get();16         Elements node = document.select(".resultlist");17         Elements elements = node.get(0).child(0).children();18for(Elementitem:elements){19             UrlVO urlVO = newUrlVO();20             urlVO.setProductDetailUrl(item.child(1).child(0).child(0).child(0).attr("href"));21             urlVO.setSmallImageUrl(item.child(0).child(0).child(0).attr("src"));22list.add(urlVO);23}24}2526/**27*根據url和頁數獲取商品詳細url28*@paramurl29*@paramstartPage30*@paramendPage31*@paramlist32*/33publicstaticvoidgetBookUrlByUrlAndPageNum(Stringurl,IntegerstartPage,IntegerendPage,Listlist){34try{35for(int i = startPage; i <= endPage; i++){36                 String urlStr = url +i;37Utils.getBookUrlFromPage(urlStr,list);38}39         } catch(Exceptione){40e.printStackTrace();41}42}4344/**45*根據商品詳細頁面獲取Product對象46*@paramurl47*@return48*/49publicstaticProductgetProductFromUrl(Stringurl){50//這裏有些數據利用jsoup獲取不到51//我用的是htmlunit,設置setJavaScriptEnabled,setAjaxController等參數52//具體代碼就不貼了,大家可以自己試試53//如有需要,求留言54returnnull;55}5657/**58*根據圖片url和文件名保存圖片59*@paramurlStr60*@paramfilename61*/62publicstaticvoid saveImageByUrlAndName(String urlStr, String filename) throwsException{63//構造URL64         URL url = newURL(urlStr);65//打開連接66         URLConnection con =url.openConnection();67//輸入流68         InputStream is =con.getInputStream();69//1K的數據緩衝70byte[] bs = newbyte[1024];71//讀取到的數據長度72intlen;73//輸出的文件流74         OutputStream os = newFileOutputStream(filename);75//開始讀取76while ((len = is.read(bs)) != -1){77             os.write(bs, 0,len);78}79os.flush();80//關閉連接81os.close();82is.close();83}8485//測試及調用86publicstaticvoidmain(String[]args){87         List<UrlVO> list = new ArrayList<UrlVO>();88try{89             getBookUrlByUrlAndPageNum("http://category.dangdang.com/all/?category_path=01.03.38.00.00.00&page_index=", 1, 2,list);90//getBookUrlFromPage("http://category.dangdang.com/all/?category_path=01.03.38.00.00.00&page_index=2",list);91         } catch(Exceptione){92e.printStackTrace();93}94System.out.println(list.size());9596//保存圖片97//StringurlStr="http://img32.ddimg.cn/28/35/23207212-1_l.jpg";98//try{99//saveImageByUrlAndName(urlStr,"1.jpg");100//}catch(Exceptione){101//e.printStackTrace();102//}103}104 }

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