經(jīng)驗(yàn)不在于年限,在于積累---專注互聯(lián)網(wǎng)軟件開發(fā)

          把工作當(dāng)事業(yè)做,把項(xiàng)目當(dāng)作品做!

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            55 Posts :: 0 Stories :: 66 Comments :: 0 Trackbacks
           

          Web-Harvest是一個(gè)Java開源Web數(shù)據(jù)抽取工具。它能夠收集指定的Web頁面并從這些頁面中提取有用的數(shù)據(jù)。其實(shí)現(xiàn)原理是,根據(jù)預(yù)先定義的配置文件用httpclient獲取頁面的全部內(nèi)容(關(guān)于httpclient的內(nèi)容,本博有些文章已介紹),然后運(yùn)用XPathXQuery、正則表達(dá)式等這些技術(shù)來實(shí)現(xiàn)對(duì)text/xml的內(nèi)容篩選操作,選取精確的數(shù)據(jù)。前兩年比較火的垂直搜索(比如:酷訊等)也是采用類似的原理實(shí)現(xiàn)的。Web-Harvest應(yīng)用,關(guān)鍵就是理解和定義配置文件,其他的就是考慮怎么處理數(shù)據(jù)的Java代碼。當(dāng)然在爬蟲開始前,也可以把Java變量填充到配置文件中,實(shí)現(xiàn)動(dòng)態(tài)的配置。

          (友情提示:本博文章歡迎轉(zhuǎn)載,但請(qǐng)注明出處:陳新漢,http://www.aygfsteel.com/hankchen

          現(xiàn)在以爬取天涯論壇的所有版面信息為例,介紹Web-Harvest的用法,特別是其配置文件。

          天涯的版塊地圖頁面時(shí):http://www.tianya.cn/bbs/index.shtml

          image

          [天涯的部分版面列表]

          我們的目標(biāo)就是要抓取全部的版塊信息,包括版塊之間的父子關(guān)系。

          先查看版塊地圖的頁面源代碼,尋求規(guī)律:

          <div class="backrgoundcolor">

          <div class="bankuai_list">

                 <h3>社會(huì)民生</h3>

                 <ul>

                        <li><a id="item天涯雜談">天涯雜談</a></li>

                        <li><a id="item國際觀察">國際觀察</a></li>

                        <li><a id="item天涯時(shí)空">天涯時(shí)空</a></li>

                        <li><a id="item傳媒江湖">傳媒江湖</a></li>

                        …… //省略

          </ul>

          </div>

          <div class="clear"></div>

          </div>

          <div class="nobackrgoundcolor">

          <div class="bankuai_list">

                 <h3>文學(xué)讀書</h3>

                        <ul>

                               <li><a id="item蓮蓬鬼話">蓮蓬鬼話</a></li>

                               <li><a id="item煮酒論史">煮酒論史</a></li>

                               <li><a id="item舞文弄墨">舞文弄墨</a></li>

                               ……. //省略

                        </ul>

          </div>

          <div class="clear"></div>

          </div>

          ……. //省略

          通過頁面源碼分析,發(fā)現(xiàn)每個(gè)大板塊都是在<div class="bankuai_list"></div>的包括之下,而大板塊下面的小版塊都是下面的形式包含的。

          <li><a href="xxx" id="xxx">xxx</a></li>,這些規(guī)律就是webharvest爬數(shù)據(jù)的規(guī)則。

          下面先給出全部的配置:(tianya.xml)

          <config charset="utf-8">

                   <var-def name="start">

                      <html-to-xml>

                             <http url="http://www.tianya.cn/bbs/index.shtml" charset="utf-8" />

                      </html-to-xml>

                   </var-def>

                   <var-def name="ulList">

                      <xpath expression="http://div[@class='bankuai_list']">

                             <var name="start" />

                      </xpath>

                   </var-def>

                  <file action="write" path="tianya/siteboards.xml" charset="utf-8">

                         <![CDATA[ <site> ]]>

                         <loop item="item" index="i">

                             <list><var name="ulList"/></list>

                             <body>

                                 <xquery>

                                     <xq-param name="item">

                                      <var name="item"/>

                                     </xq-param>

                                     <xq-expression><![CDATA[

                                             declare variable $item as node() external;

                                             <board boardname="{normalize-space(data($item//h3/text()))}" boardurl="">

                                             {

                                                   for $row in $item//li return

                                                       <board boardname="{normalize-space(data($row//a/text()))}" boardurl="{normalize-space(data($row/a/@href))}" />

                                            }

                                            </board>

                                     ]]></xq-expression>

                                 </xquery>

                             </body>

                         </loop>

                         <![CDATA[ </site> ]]>

                  </file>

          </config>

          這個(gè)配置文件分為三個(gè)部分:

          1.      定義爬蟲入口:

          <var-def name="start">

             <html-to-xml>

                  <http url="http://www.tianya.cn/bbs/index.shtml" charset="utf-8" />

                </html-to-xml>

             </var-def>

                 爬蟲的入口URL是:http://www.tianya.cn/bbs/index.shtml

                 同時(shí),指定了爬蟲的爬數(shù)據(jù)的編碼,這個(gè)編碼應(yīng)該根據(jù)具體的頁面編碼來定,例如上面的入口頁面的編碼就是utf-8。其實(shí),有很多的中文頁面的編碼是gbk或者gb2312,那么這個(gè)地方的編碼就要相應(yīng)設(shè)置,否則會(huì)出現(xiàn)數(shù)據(jù)亂碼。

          2.      定義數(shù)據(jù)的過濾規(guī)則:

          <var-def name="ulList">

              <xpath expression="http://div[@class='bankuai_list']">

                  <var name="start" />

                 </xpath>

          </var-def>

                 上面配置就是根據(jù)XPath從爬得的數(shù)據(jù)中篩選合適的內(nèi)容。這里需要得到所有的<div class="bankuai_list"></div>信息。有關(guān)XPathXQuery的語法請(qǐng)網(wǎng)上查詢。

          3.      最后一步就是處理數(shù)據(jù)。可以寫入XML文件,也可以使用SetContextVar的方式把收集的數(shù)據(jù)塞到一個(gè)集合變量中,供Java代碼調(diào)用(比如:數(shù)據(jù)直接入庫)。
          這里是直接寫入
          XML文件,然后解析XML即可。

          注意下面的for循環(huán),這是XQuery的語法,提供遍歷的功能。由于大版面小版塊是一個(gè)樹狀結(jié)構(gòu),需要這種遍歷。

          <board boardname="{normalize-space(data($item//h3/text()))}" boardurl="">

          {

                 for $row in $item//li return

          <board boardname="{normalize-space(data($row//a/text()))}" boardurl="{normalize-space(data($row/a/@href))}" />

          }

          </board>

          相關(guān)的Java代碼如下:

          /**

          * Copyright(C):2009

           * @author陳新漢

           * Sep4,20093:24:58PM

           */

          String configFile="tianya.xml";

          ScraperConfiguration config = new ScraperConfiguration(configFile);

          String targetFolder="c:\\chenxinhan";

          Scraper scraper = new Scraper(config,targetFolder);

          //設(shè)置爬蟲代理

          scraper.getHttpClientManager().setHttpProxy("218.56.64.210","8080");

          scraper.setDebug(true);

          scraper.execute();

          上面代碼執(zhí)行完成后,收集的數(shù)據(jù)文件地址為:c:\chenxinhan\tianya\siteboards.xml

          友情提示:本博文章歡迎轉(zhuǎn)載,但請(qǐng)注明出處:陳新漢,http://www.aygfsteel.com/hankchen

          posted on 2009-09-22 11:58 hankchen 閱讀(10411) 評(píng)論(6)  編輯  收藏 所屬分類: Spider+Lucene+solr+nutch

          Feedback

          # re: Webharvest網(wǎng)絡(luò)爬蟲應(yīng)用總結(jié) 2009-09-23 02:52 dff
          http://s.click.taobao.com/t_1?i=rWs3FkQtwkA%3D&p=mm_14068224_0_0&n=12  回復(fù)  更多評(píng)論
            

          # re: Webharvest網(wǎng)絡(luò)爬蟲應(yīng)用總結(jié)[未登錄] 2009-09-25 10:25 小人物
          不錯(cuò) ,這篇文章對(duì)我很有幫助。  回復(fù)  更多評(píng)論
            

          # re: Webharvest網(wǎng)絡(luò)爬蟲應(yīng)用總結(jié)[未登錄] 2009-10-26 16:19 sailor

          @小人物
          請(qǐng)問,能不能深入抓取多個(gè)頁面呀。
          如:分類下的文章的詳細(xì)信息
          用以下的形式表式
          <root>
          <category id=1>
          <new id=1>
          <title>111111</title>
          <author>111111</author>
          <body>111111</body>
          </new>
          <new id=2>
          <title>111111</title>
          <author>111111</author>
          <body>111111</body>
          </new>
          </category>
          <category id=2>
          <new id=3>
          <title>111111</title>
          <author>111111</author>
          <body>111111</body>
          </new>
          <new id=4>
          <title>111111</title>
          <author>111111</author>
          <body>111111</body>
          </new>
          </category>
          </root>
            回復(fù)  更多評(píng)論
            

          # re: Webharvest網(wǎng)絡(luò)爬蟲應(yīng)用總結(jié) 2012-11-13 22:46 水水
          求工程源碼  回復(fù)  更多評(píng)論
            

          # re: Webharvest網(wǎng)絡(luò)爬蟲應(yīng)用總結(jié) 2012-11-13 22:47 水水
          求工程源碼哦  回復(fù)  更多評(píng)論
            

          # re: Webharvest網(wǎng)絡(luò)爬蟲應(yīng)用總結(jié) 2013-05-26 20:49 黃陳
          scraper.getHttpClientManager().setHttpProxy("218.56.64.210","8080");
          是什么意思啊?  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 花莲县| 永州市| 六安市| 鹿邑县| 厦门市| 应城市| 宁南县| 察雅县| 正安县| 长垣县| 河北区| 乌苏市| 茂名市| 竹溪县| 锡林浩特市| 阳新县| 固镇县| 蒙自县| 盐边县| 临西县| 壤塘县| 湟中县| 灌云县| 胶州市| 阜康市| 东丽区| 三明市| 潜江市| 古蔺县| 武胜县| 吴旗县| 汾西县| 锡林浩特市| 安阳市| 莒南县| 梅河口市| 东阳市| 江都市| 紫云| 大名县| 弥勒县|