小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用 web-harvest 挖掘需要的數(shù)據(jù)-非決定性因素-搜狐博客

 ShangShujie 2010-05-06

    首先,在官方網(wǎng)站下載web-harvest, 目前最新版本是1.0,下載頁面分三個(gè)下載包,分別是webharvest1-exe.zipwebharvest1-bin.zip,webharvest1-project.zip,他們沒實(shí)質(zhì)區(qū)別,第一個(gè)是包含了全部第三方包(一起打入了 同一個(gè)jar文件直接可運(yùn)行),第二個(gè)做為一個(gè)中間件出現(xiàn),附帶了所有獨(dú)立的第三方j(luò)ar包,第三個(gè)則是源碼,當(dāng)然要最大的靈活性自然選擇下載源碼了:》

下載下來后再eclipse建立一個(gè)空項(xiàng)目,把所有解壓出來的文件夾仍進(jìn)去,然后把src和config設(shè)為source folder (源碼目錄) 然后看到default包下面有個(gè)Test.java的文件,下面我們來看看這個(gè)文件:

        ScraperConfiguration config = new ScraperConfiguration("c:/temp/scrapertest/dddd.xml");
        Scraper scraper = new Scraper(config, "c:/temp/scrapertest/");
        scraper.setDebug(true);
        long startTime = System.currentTimeMillis();
        scraper.execute();
        System.out.println("time elapsed: " + (System.currentTimeMillis() - startTime));

除去log4j的注解外,剩下的就是這幾行代碼啦,我們看到運(yùn)行挖掘任務(wù)只需要3行代碼,創(chuàng)建config,用config和挖取到數(shù)據(jù)存儲(chǔ)目錄做 參數(shù)創(chuàng)建Scraper,然后執(zhí)行就OK。

好了,先試試,它能不能工作,在剛才解壓出來的文件中,有一個(gè)examples文件夾下面有很多,配置文件可以先試試手,首先,看看圖片挖取的例子 google_images.xml,更改上面的兩行代碼

        ScraperConfiguration config = new ScraperConfiguration("E:/workspace/webharvest/examples/google_images.xml");

        Scraper scraper = new Scraper(config, " E:/workspace/webharvest/examples/");

然后運(yùn)行這個(gè)Test在console窗口會(huì)看到抓取過程,完成后再E:\workspace\webharvest\examples \google_images目錄下就能看到剛才抓取到的所有圖片了,抓取非常簡(jiǎn)單,到此為止,我們看看他的配置文 件,google_images.xml到底有什么魔法。

在google_images.xml中,這個(gè)配置文件中首先引用了一個(gè)functions.xml,在google_images.xml同級(jí)目 錄下,我們先看看這個(gè)文件。這個(gè)文件中定義了一個(gè)function(函數(shù))名字是download-multipage-list雖然不符合java函數(shù) 定義規(guī)則,但是這里只是一個(gè)函數(shù)名,函數(shù)return了一個(gè)循環(huán)出來的結(jié)果集,empty標(biāo)記表示其中的執(zhí)行結(jié)果不包含在返回結(jié)果集內(nèi),那么主要返回的就 是:
                <xpath expression="${itemXPath}">
                    <var name="content"/>
                </xpath>
這段了,這段代碼 表示,用xpath方式(解析規(guī)則是expression表達(dá)式?jīng)Q定的)解析引用的content內(nèi)容,做為一個(gè)行記錄(這個(gè)行記錄會(huì)被默認(rèn)封裝成一個(gè) List(不是普通的list而是:org.webharvest.runtime.variables.ListVariable);

循環(huán)的主體主要實(shí)現(xiàn)讀取數(shù)頁(多少頁由$maxloops變量決定)的數(shù)據(jù).


現(xiàn)在看看empty內(nèi)部的功能:

首先
<var-def name="content">
    <html-to-xml>
        <http url="${pageUrl}"/>
    </html-to-xml>
</var-def>
是定義一個(gè)content變量,內(nèi)容是訪 問${pageUrl}頁面內(nèi)容。

接著:
<var-def name="nextLinkUrl">
    <xpath expression="${nextXPath}">
        <var name="content"/>
    </xpath>
</var-def>

是用xpath表達(dá)式(${nextXPath})取content變量?jī)?nèi)部的值(也就是剛才${pageUrl}頁面解析)得到下一頁的URL地 址。

<var-def name="pageUrl">
      <template>${sys.fullUrl(pageUrl.toString(), nextLinkUrl.toString())}</template>
</var-def>

對(duì)pageUrl重新賦值,將下一頁賦值給pageUrl下次循環(huán)讀下一頁數(shù)據(jù)解析。

好了這個(gè)函數(shù)簡(jiǎn)單的說就是用來分頁取數(shù)據(jù)的。

回到google-images.xml文件我們繼續(xù)看:

      <!-- defines search keyword and start URL -->
      <var-def name="search" overwrite="false">platon</var-def>
      <var-def name="url">
            <xpath expression="http://noscript//a/@href[1]">
                  <html-to-xml>
                   <http url="http://images.google.com/images?q=${search}&hl=en&btnG=Search+Images"/>
                  </html-to-xml>
            </xpath>
    </var-def>

很簡(jiǎn)單,定義一個(gè)變量做搜索條件給url中,然后用html-to-xml標(biāo)記把http標(biāo)記訪問url的頁面html內(nèi)容轉(zhuǎn)換為xml,最后用 xpath一個(gè)表達(dá)式得到頁面真實(shí)的url(看來google確實(shí)比較麻煩,其他網(wǎng)站可以直接得到url的)。

      <!-- collects all image URLs -->
      <var-def name="imgLinks">
        <call name="download-multipage-list">
            <call-param name="pageUrl"><var name="url"/></call-param>
            <call-param name="nextXPath">//td[.='Next']/a/@href</call-param>
            <call-param name="itemXPath">//img[contains(@src, 'images?q=tbn')]/@src</call-param>
            <call-param name="maxloops">5</call-param>
        </call>
      </var-def>

    這段的功能就是調(diào)用分頁函數(shù),把itemXPath參數(shù)中的xpath表達(dá)式內(nèi)容,限定解析的頁面內(nèi)容封裝成一個(gè)list啦

首先定義了4個(gè)參數(shù),然后調(diào)用functions定義的download-multipage-list函數(shù),最后將返回值賦給 imgLinks(這就完成了圖片url的抓取工作了)。

    <!-- download images and saves them to the files -->
    <loop item="link" index="i" filter="unique">
        <list>
            <var name="imgLinks"/>
        </list>
        <body>
            <file action="write" type="binary" path="google_images/${search}_${i}.gif">
                <http url="${sys.fullUrl(url, link)}"/>
            </file>
        </body>
    </loop>

雖然已經(jīng)完成了抓取過程,但是圖片還沒有保存在本地呢,這里我們就要循環(huán)調(diào)用file標(biāo)簽,來把url中的圖片逐一保存在本地啦。
這里很簡(jiǎn) 單,需要注意的就是loop循環(huán),比較不同的是loop必須包含一個(gè)list和body,會(huì)把list逐一迭代出來,body代碼中有句 sys.fullUrl函數(shù),是用來處理抓到的相對(duì)地址修正為完整的http開頭的絕對(duì)地址,參數(shù)url是前面我們定義的,link是loop循環(huán)體變量 在循環(huán)里面定義的。

看完了這個(gè)我們做個(gè)我們看到只要用xpath表達(dá)式,對(duì)任何頁面的相對(duì)位置抓取都不是問題了。

Web-harvest已經(jīng)解決了大部分問題,我們要做的就是寫配置文件了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多