Sosoo 1.0網絡爬蟲程序

Sosoo 1.0網絡爬蟲程序
---用戶開發手冊
編寫人:王建華(rimen/jerry)
編寫目的:基於sosoo定製web spider程序的編程人員。
                             目錄
 

一:安裝sosoo 2
二:功能定製 2
1.基本功能參數的設置。 2
2.配置機器人對url的檢查 3
3:實現文件管理。 4
4.定製html文檔下載規則。 4
5.設置對下載後http文檔的過濾處理 5
6.啓用機器人運行期監控。 5
7.啓用對http協議分析的監控。 5
三:sosoo描述 6
四:應用開發指南 6
1.Roboter類,spider程序的主類。 6
2.TaskList接口,解決對處理任務的存儲。 7
3.Http客戶端實現。 7
4.實現網頁存儲或處理 7
5.實現運行期的監控 8
五.程序例子 9
六.參考依賴 10
 


一:安裝sosoo
sosoo提供的是一個sosoo-core.jar包,其中並沒有提供可運行的程序入口。如果要使用可以通過src中的examples進行體驗。開發者可以基於在這上開發出基於UI,j2ee等spider程序
 把sosoo-core包加入到你應用的classpath中。
 Sosoo 提供一個線程類的來代表一個機器人com.sosoo.robot.spider. Roboter。
 通過一個測試類
   public static void main(String[] args)
    throws Exception
   {
    Roboter robby = new Roboter();
robby.setStartURL(new URL("http://10.25.101.173:7001/pa18Web/framework/images/framevork_04.gif"));
    robby.setMaxDepth(0);   //設置最大連接訪問深度
    robby.setSleepTime(0);
robby.setWalkToOtherHosts(true);
robby.run();      //啓動
}
 這樣就啓動了一個spider程序,sosoo將根據你對javaBean參數的設置進行對網絡上html
的抓取.
 停止機器人.
robot.stopRobot();
二:功能定製
Sosoo利用回調的方式實現了aop,用戶可以通過回調的方式注入javaBean對象,以實現其外部功能
1.基本功能參數的設置。
基本功能指: roboter的原生類型參數(或String),例如:startURL,maxDepth等。

設置開始處理的url【startURL】:必須參數,roboter會根據這個地址開始在網絡上進行查找。
robby.setStartURL(URL url);

設置從開始路徑能找的最大深度【maxDepth】:程序會判斷當前處理的鏈接深度是否超過最大鏈接深度,如果超過這個鏈接將忽略,當然你可以通過設置depthIsEffect來屏蔽這個功能。默認值爲1。
robby.setMaxDepth(0);

設置處理文檔的時間間隔【sleepTime】:當處理完一個url時,設置這個間隔時間處理下一個url。單位爲s,默認值爲60,推薦使用5s。
robby.setSleepTime(0);
 
    設置http連接超時時間:在連接服務器時,可能由於網絡或者本身服務的原因,可
能會出現超時的情況,通過設置超時時間來限制對某個url連接的最大時間,這樣就可以提高處理的速度,但是如果這個值設置太小,可能很多連接都會連接不到,建議使用大於30的值,默認爲60s。
robby.setUrlConnectTimeOut(30);

停止robby線程【stopIt】:你可以通過對robby對象進行操作來停止當前的線程。
robby.stopRobot();

暫停robby線程【sleep】:可以對當前運行的robby線程進行暫停。
robby.setSleep(true);
2.配置機器人對url的檢查
  sosoo spider會根據用戶的設置把收集到url列表中過濾掉不符合條件的url。
  過濾的順序:walkToOtherHosts-allowWholeHost-flexibleHostCheck-
allowWholeDomain-用戶提供url列表。

設置是否訪問其他的主機【walkToOtherHosts】:如果你需要進行整個互聯網的搜索,而不限於你開始提供的url中的主機,把這個參數設置爲true。默認爲false。

robby.setWalkToOtherHosts(true);


設置是否訪問本主機【allowWholeHost】:如果你只想要對開始url代表的主機進行訪問,你可以通過設置這個參數進行過濾url。
robby.setAllowWholeHost(true);

設置非www開始的主機【flexibleHostCheck】:當你提供的開始url,不是以www開頭,你可以通過設置flexibleHostCheck參數來達到訪問本主機的目的。
robby.setFlexibleHostCheck(true);

設置是否訪問本域【allowWholeDomain】:如果你只想要對開始url代表的域進行訪問,你可以通過設置下面這個參數進行過濾url。
robby.setAllowWholeDomain(true);

設置要訪問的url列表【allowedURLs】:這是一個Vector類型的變量,用戶可以把這些url放在配置文件中,用戶可以在運行時提供這個變量。
robby.setAllowedURLs(allowed);


定製url檢查規則【URLCheck】:用戶除了通過上面的規則進行url過濾,用戶還可以通過實現urlCheck接口來進行url檢測。系統已經提供了RegExpURLCheck實現。提供對properties文件的支持。
robby.setURLCheck(check);

設置是否要找網站跟目錄下的/robot.txt文件【ignoreRobotsTxt】:用戶可以通過設置這個值來忽略網站提供對robot的支持。默認爲false
robby.setIgnoreRobotsTxt(true);

設置url可以重複訪問【visitMany】:系統提供了一個訪問過的列表緩存,當spider程序發現這個url已經訪問過,他將不進行這個url的處理。可以通過這個參數來定製可以重複訪問的url列表,這是一個Vector類型。
robby.setVisitMany(visitMany);

設置spider客戶端的【proxy】:spider可以通過代理連接internate,但是目前只支持匿名的代理服務器。
robby.setProxy("10.16.111.5:80");
3:實現文件管理。
Spider程序下載url對應的html文檔的時候,系統提供一個回調接口HttpDocManager。你可以通過的持接口的實現,把spider獲得html數據進行存儲,例如你可以把這些文件以文本流存入數據庫,存入文件系統等。系統提供了HttpDocToFile實現,把下載的文件存入文件系統。你可以在啓動spider程序的時候通過robby.setDocManager(dm);進行注入管理對象。
4.定製html文檔下載規則。
  當你對各種html文件的格式處理有要求的時候,例如你覺得下載exe,rar文件比較
  慢的時候,你可以通過自己的需求定製下載規則。通過實現HttpDownloadCheck
接口可以設定下載的規則。
DownloadRuleSet rules=new DownloadRuleSet("downrules.properties");
robby.setDownloadRuleSet(rules);

系統已經提供了DownloadRuleSet實現,這個是想通過classpath properties來定義下載規則.
文件的內容:
# the file must contain two field,allow[deny] and MIME Type/sub type
# allow stand for if the doc match the conditions,will down the file
# deny stand for if the doc match the conditions,will not down the file
# < size ,express the doc content byte size is smaller than the value
# > size ,express the doc contact byte size is larger than the value
# can't hold out the >= or <=
# the scope of size is optional.
allow image/gif  <100000 >10000000
deny image/gif  <100000 >10000000
當然你可以自定義自己的實現,只要實現HttpDownloadCheck的boolean
downloadAllowed(Vector httpHeaders) ;方法。
注意:如果這個文檔沒有下載,這個文檔中的連接將不能進行處理,所以一般不建
議過濾掉text/html.

5.設置對下載後http文檔的過濾處理
  下載文檔後,用戶可以對這個doc對象進行一系列的處理。Spider提供了一個
FilterChain類。用戶可以把自己過濾器加入FilterChain中。
你可以實現DocumentFilter接口定製自己的功能,系統實現提供了一個LinkLocalizer實現,用於替換相對連接。
    FilterChain filters=new FilterChain();
    DocumentFilter filter=new LinkLocalizer();
    filters.add(filter);
    robby.setFilters(filters);
6.啓用機器人運行期監控。
當啓動spider程序後,程序利用回調接口提供給用戶運行期的狀態。例如你要要顯示機器人對應的處理過的任務,處理中的任務,處理是的狀態。通過實現RobotCallback接口來實現,當然你也可以直接取roboter對象的屬性來監控。
系統提供RobotMonitor實現,用戶打印在cosole上運行期的狀態。

RobotCallback monitor=new Monitor();
robby.setWebRobotCallback(monitor);

7.啓用對http協議分析的監控。
  Spdier循環處理緩存中未處理的url,對於每個url的處理,系統提供一些監控方
法。當然你只要實現HttpToolCallback接口。系統提供了SystemOutHttpToolCallback實現。
HttpToolCallback toolMonitor=new SystemOutHttpToolCallback();
robby.setHttpToolCallback(toolMonitor);
三:sosoo描述
 Sosoo是參考jobo提供的核心算法。利用對訪問的歷史記錄存儲來替換spider的遞歸算
法。在處理的效率上有不錯的體驗,但是它也是犧牲存儲爲代價的。在程序啓動是,系
統將建立兩個Vector數組對訪問url進行記錄。因此sosoo並不使用於大數據量信息抓取,但是對於行業網站,中小企業絕對足夠。

目前sosoo提供的處理功能:
支持跨域跨主機的訪問
支持多種文件格式的下載
支持對html中連接的遞歸處理
支持http1.1協議但不支持1.0
支持匿名代理(http),但不知道需要驗證代理。

待擴展的功能:
提供全功能http協議處理
提供javasript的支持
提供表單from的處理支持
提供對ftp協議的支持
提供全方位的代理(http,sock等)支持。
完善系統監控功能
加強對html文檔的信息處理能力
提供各種文件類型的處理工具
提供對rss的支持

四:應用開發指南
 sosoo提供很強的編程擴展,很容易把他集成到你的j2ee項目中。在中小型搜索引擎中,
特別對某一些特定的行業網站的數據進行分析時,Sosoo提供方便和安全的解決方案。
通過上述對功能的定製,我們可以看到在應用中我們對sosoo的編程接口並不多,而且目前系統都是基於set的方式注入aop注入對象,這樣很容易和spring等基於set方式的依賴注入(IOC)框架集成。
1.Roboter類,spider程序的主類。
當你需要把sosoo應用到你的應用中時,roboter提供一個基於線程的工具類。它體可在程序中啓動,暫停,退出一個spdier程序。這個類有sosoo提供,並不支持擴展,它標識spider的主體。它是整個spider程序所有功能的入口,包括回調功能,都是通過set方式注入到roboter中。
com.sosoo.robot.spider.Roboter
例如你要啓動一個spider線程:

    Roboter robby = new Roboter();
robby.setStartURL(new URL("http://10.25.101.173:7001/pa18Web/framework/images/framevork_04.gif"));
    robby.setMaxDepth(0);   //設置最大連接訪問深度
    robby.setSleepTime(0);
robby.setWalkToOtherHosts(true);
robby.run();      //啓動
2.TaskList接口,解決對處理任務的存儲。
對於sosoo而言,每個url對於一個任務。系統已經提供其默認的實現,你可以根據自己的需求實現這個接口。然後在啓動spdier的時候用register方法進行註冊。
  robby .registerVisitedList(new HashedMemoryTaskList(false));
  robby .registerToDoList(new HashedMemoryTaskList());
  com.sosoo.robot.spider.TaskList
  主要解決是對com.sosoo.robot.spider.RobotTask對象的存儲。和常用的操作方
法,例如刪除,
添加,查找等。具體參見@JAVADOC
3.Http客戶端實現。
目前對sosoo1.0客戶端而言,主要的用途就是提供模擬瀏覽器進行對http文檔的獲取。同時把他轉換爲HttpDoc對象。同時對http請求資源的管理,例如cookie管理。
Sosoo主要是通過com.sosoo.robot.http.HttpTool工具類來提供此工能。你也可以自己定製更優化的處理方案替換,同樣通過register方法進行註冊。由於重載這個工具需要對http協議有深刻的連接,一般不建議替換系統的實現。
Robby.RegisterHttpParser(new HttpTool);
4.實現網頁存儲或處理
當spider程序下載完以後,spider會用docManager管理其和filter來處理html文檔和其內容。
HttpDocManager接口主要用來對HttpDoc對象的管理,例如把它存儲在文件系統,或存入數據庫等。系統提供了實現HttpDocToFile用來把HttpDoc對象存放在在文件系統中。
FilterChain主要用來進行httpDoc內容的一系列過濾功能。例如你主要取其中的某些信息。或者替換其中某些內容。它是實現了一個數組存儲,你可以根據自己的需求加入多個實現DocumentFilter接口的對象,系統提供了一個實現LinkLocalizer,用來替換其中的相對連接。

系統先進行filter處理,然後在進行HttpDocManager

具體編程參考@javadoc

5.實現運行期的監控
Sosoo提供了兩個監控的接口。用戶可以實現這寫接口的某些或全部方法,達到載
運行期內某些狀態的監控。
Spider監控:com.sosoo.robot.spider.RobotCallback
主要提供文檔的處理,spider的睡眠,spider當前任務的監控。
  void webRobotRetrievedDoc(String url, int size);
 //實現對獲取url對應的HttpDoc對象的監控
  void webRobotUpdateQueueStatus(int length);
 //實現當前處理任務的監控
  void webRobotDone();
 //處理完成
  void webRobotSleeping(boolean sleeping);
 //spider暫停
http分析監控:com.sosoo.robot.http.HttpToolCallback
/**
   * After initiating a download, this method will be called to
   * inform about the URL that will be retrieved
   *  @param URL url that will be retrieved now
   */
  void setHttpToolDocUrl(String url);
 
  /**
   * After HttpTool got a Content-Length header
   * this method will be called to inform about the size of
   * the document to retrieve
   * @param size document size in
   */
  void setHttpToolDocSize(int size);
 

  /**
   * after a block of bytes was read (default after every 1024 bytes,
   * this method will be called
   * @param size the number of bytes that where retrieved
   */
  void setHttpToolDocCurrentSize(int size);

  /**
   * informs about the current status of the HttpTool
   * @param status an integer describing the current status
   * constants defined in HttpTool
   * @see HttpTool
   */
  void setHttpToolStatus(int status);
系統提供了SystemOutHttpToolCallback默認實現。
五.程序例子
package com.sosoo.robot.examples;

/*********************************************
    Copyright (c) 2005 by rimen sosoo
*********************************************/

import java.net.URL;

import com.sosoo.robot.http.DownloadRuleSet;
import com.sosoo.robot.http.HttpDocManager;
import com.sosoo.robot.http.HttpDocToBean;
import com.sosoo.robot.http.HttpToolCallback;
import com.sosoo.robot.http.SystemOutHttpToolCallback;
import com.sosoo.robot.spider.RobotCallback;
import com.sosoo.robot.spider.RobotMonitor;
import com.sosoo.robot.spider.Roboter;
import com.sosoo.robot.spider.docfilter.DocumentFilter;
import com.sosoo.robot.spider.docfilter.FilterChain;
import com.sosoo.robot.spider.docfilter.LinkLocalizer;

/**
 * This example program downloads a web page. It does not
 * store the documents but only logs the visited URLs.
 *
 * @author jerry[wangjianhua] sosoo
 * @version $Revision: 1.1 $
 */
public class SpiderMain {

  public static void main(String[] args)
    throws Exception
  {
    System.out.println("URLs will be logged to urls.txt/n/n");

    Roboter robby =new Roboter();
    System.out.println(robby);
    robby.setStartURL(new URL("http://www.sina.com.cn/"));
    robby.setMaxDepth(0);
    robby.setDepthIsEffect(true);
    robby.setSleepTime(0);
    robby.setIgnoreRobotsTxt(true);  
    robby.setWalkToOtherHosts(true);
   

   
    FilterChain filters=new FilterChain();
    DocumentFilter filter=new LinkLocalizer();
    filters.add(filter);
    //html流過濾器
   
    DownloadRuleSet rules=new DownloadRuleSet("downrules.properties");
    HttpDocManager dm = new HttpDocToBean();
    //進行文檔管理,可以存放在數據庫也可以存放在本地。
   
    RobotCallback monitor=new RobotMonitor();
    HttpToolCallback toolMonitor=new SystemOutHttpToolCallback();
   
    robby.setDocManager(dm);   
    robby.setDownloadRuleSet(rules);
    robby.setFilters(filters);
    robby.setWebRobotCallback(monitor);
    robby.setHttpToolCallback(toolMonitor);
  
    robby.run(); //啓動

  }
}
 
六.參考依賴
 Jobo spider實現
 Tidy html解析器
 Log4j日誌記錄器
 Apach 提供的正值表達式操作器

 

發佈了139 篇原創文章 · 獲贊 3 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章