通過java抓取任何指定網頁的數據

          Posted on 2009-12-17 17:31 terryxue 閱讀(18112) 評論(6)  編輯  收藏 所屬分類: java

          假設你需要獲取51job人才網上java人才的需求數量,首先你需要分析51job網站的搜索這一塊是怎么運作的,通過解析網頁的源代碼,我們發現了以下一些信息:
          1. 搜索時頁面請求的URL是 http://search.51job.com/jobsearch/search_result.php
          2. 請求所用的方法為:POST
          3. 返回的頁面的編碼格式為:GBK
          4. 假設我們想獲取搜索java人才時結果頁面中顯示的需求數量,我們發現數量位于返回的HTML數據中這樣的一段代碼之中:<td>1-30 / 14794</td>,于是我們可以得到這樣的一個模式:".+1-\d+ / (\d+).+",第一個分組的內容就是我們需要的最終數據,有關java中的模式,請參考java文檔中Pattern類的介紹
          5. 另外做為POST請求,頁面向服務器發送的數據如下(這個很容易能過prototype這樣的js框架抓取到,參考我的其它博客介紹):lang=c& amp; amp;stype=1&postchannel=0000&fromType=1&line=&keywordtype=2&keyword=java&btnJobarea=%E9%80%89%E6%8B%A9%E5%9C%B0%E5%8C%BA&jobarea=0000&image=&btnFuntype=%E9%80%89%E6%8B%A9%2F%E4%BF%AE%E6%94%B9&funtype=0000&btnIndustrytype=%E9%80%89%E6%8B%A9%2F%E4%BF%AE%E6%94%B9&industrytype=00
          對于第5條中的數據哪些是服務器真正需要的我們不管,全部發送過去就是了。有了這些準備,我們就可以真正開始通過java發送請求,并獲得最終數據了。

          我們定義Resource類,這個類封裝所有的與請求有關的信息,Resource包括以下屬性:

          /**
            * 需要獲取資源的目標地址,不包含查詢串
            
          */

           
          private String target;
            
          /**
            * get請求時的查詢串,或post請求的請求數據
            
          */

           
          private String queryData = "";
           
           
          /**
            * 請求方式,get / post
            
          */

           
          private String method = "GET";
           
           
          /**
            * 返回的數據的編碼類型
            
          */

           
          private String charset = "GBK";
           
           
          /**
            * 抓取數據的模式,將根據模式的分組來返回數據列表
            
          */

           
          private String pattern;

          創建Resource的一個對象,封裝請求數據:
          Resource res = new Resource();
          res.set
          //在這里設置與請求有關的信息

          以下為抓取內容的代碼:
          //假設以下代碼中res對象封裝了所有的請求信息。
          //URL指向目的地。 
          //res.getTarget返回目標地址,且當為get請求時,這個地址包含了查詢串的信息 
          URL url = new URL(res.getTarget()); 
          HttpURLConnection con 
          = (HttpURLConnection) url.openConnection(); //建立到目的地的聯接
          con.setRequestMethod(res.getMethod()); //設置請求的方法
          //設置HTTP請求頭信息
          con.setRequestProperty("accept""*/*");  
          con.setRequestProperty(
          "connection""Keep-Alive");
          con.setRequestProperty(
          "user-agent",
                  
          "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
          con.setDoInput(
          true);
          if (res.getMethod().equals("POST")) //如果為Post請求則發送請求數據
            con.setDoOutput(true);
            con.getOutputStream().write(res.getQueryData().getBytes());
            con.getOutputStream().flush();
          }
              
          //通過BufferedReader一行行的讀取數據,如果你需要的是全部返回結果,可以修改一下這里
          BufferedReader br = new BufferedReader(new InputStreamReader(
          con.getInputStream(), res.getCharset()));
          Pattern pattern 
          = Pattern.compile(res.getPattern()); 
          String s 
          = null;
          while ((s = br.readLine()) != null{
             System.out.println(s);
             Matcher m 
          = pattern.matcher(s); //檢測當前行是否與要求結果的模式相匹配
             boolean b = m.matches();
             
          if (! b) {
                
          continue;
             }

             
          int size = m.groupCount();
             List result 
          = new ArrayList(size);
             
          for(int i=0; i<size; i++){
               result.add(m.group(i
          +1)); //如果有多個分組,則取出所有分組,并把最終結果做為列表返回
             }
               
             
          return result;
          }

          如果不需要通過提交表單數據給服務器就能抓取到最終結果,顯然上面的操作就有點小題大作了,刪除上面的部分代碼就可以了。
          補充:上文僅做java學習用,項目中需要實現網頁抓取,可以去了解一下JSOUP(http://jsoup.org/)和HTTPComponent(http://hc.apache.org/)

          Feedback

          # re: 通過java抓取任何指定網頁的數據  回復  更多評論   

          2010-03-08 16:23 by 胡長坤
          謝謝薛老師的的幫助,靜態化頁面服務已參照本文實現。謝謝薛老師,嘿嘿。

          # re: 通過java抓取任何指定網頁的數據  回復  更多評論   

          2010-12-13 15:18 by easy518
          http://www.easy518.com

          # re: 通過java抓取任何指定網頁的數據  回復  更多評論   

          2011-10-08 16:34 by 方法
          法國風格

          # re: 通過java抓取任何指定網頁的數據  回復  更多評論   

          2012-05-12 16:59 by 小崔
          想問下,我抓的網頁有驗證碼,無論我輸入什么驗證碼,都會提示驗證碼失效,能給予幫助嗎,先謝謝了

          # re: 通過java抓取任何指定網頁的數據  回復  更多評論   

          2013-12-14 11:31 by zujixie
          這個功能很強大,用處很多。很好

          # re: 通過java抓取任何指定網頁的數據  回復  更多評論   

          2014-11-25 15:35 by zuidaima
          java抓取網頁相關demo源代碼下載:http://zuidaima.com/share/k%E6%8A%93%E5%8F%96%E7%BD%91%E9%A1%B5-p1-s1.htm

          posts - 9, comments - 24, trackbacks - 0, articles - 0

          Copyright © terryxue

          主站蜘蛛池模板: 黔东| 德惠市| 普洱| 高清| 墨竹工卡县| 海淀区| 县级市| 厦门市| 合川市| 喜德县| 辉南县| 焦作市| 祁东县| 荔浦县| 西平县| 宁乡县| 巨野县| 界首市| 高安市| 灵山县| 平泉县| 乌苏市| 遵义市| 西丰县| 甘泉县| 奉节县| 西乌珠穆沁旗| 松阳县| 阿拉尔市| 宿迁市| 荃湾区| 孟津县| 武山县| 金山区| 周口市| 房山区| 台南县| 嘉荫县| 衡山县| 宝丰县| 吉水县|