goodcrawler(web crawler) Java網絡爬蟲

jopen 11年前發布 | 25K 次閱讀 網絡爬蟲 goodcrawler

為什么叫goodcrawler?

    首先它是個crawler,其次它不bad。我覺得不bad那就是good了,所以起名goodcrawler。

它是如何工作的?

    goodcrawler借用了crawler4j的一點點代碼(只保留了Page等相關結構,刪除了sleepycat的所有東西),當然依然使用
    httpclient。
    首先種子會被放入url隊列中,然后爬取工人(fetchWorker)會從url隊列中取url并爬取。
    然后爬到的頁面在在page隊列中,由抽取工人(extractWorker)從隊列中取出并抽取信息。
    接著,抽取或者提煉出來的信息會被放入store隊列中再由存儲工人(storeWorker)負責存儲。
    當然這些都是可擴展的,目前實現了66影視的提取器。本地文件系統的存儲器、elasticsearch的存儲器。。。
    這一切的工作都是多線程的,所以效率很高。

后期還會實現hdfs的存儲器、mongodb的存儲器等等。

如何抽取內容?

    goodcrawler的默認抽取器使用Jsoup對頁面進行解析,對于頁面結構設計良好的網頁,只需要在配置文件中填上需要抽取的元素的
    Xpath路徑就可以自動實現抽取,而無需使用者自己去編寫抽取器。

配置文件

conf.properties文件

pending.urls.queue.size=10000
pending.pages.queue.size=5000
failed.pages.queue.size=5000
pending.store.pages.queue.size=20000
failed.pages.backup.path=./failed-pages/
ignore.failed.pages=true
這個文件主要配置全局信息,隊列大小等

job_conf.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--全局配置 -->
<conf>
    <globalSettings>
        <threadPoolSize>30</threadPoolSize>
        <timeout>3000</timeout>
        <reportProcess>true</reportProcess>
    </globalSettings>

<!--作業配置 -->
<jobs>

    <job>
        <name>testJob</name>
        <storageType>localFile</storageType>
        <agent>Kindle</agent>
        <threadNum>2</threadNum>
        <delayBetweenRequests>100</delayBetweenRequests>
        <maxDepthOfCrawling>-1</maxDepthOfCrawling>
        <maxOutgoingLinksToFollow>1000</maxOutgoingLinksToFollow>
        <fetchBinaryContent>true</fetchBinaryContent>
        <fileSuffix>gif,jpg,png,zip,rar,aiv,mtk</fileSuffix>
        <https>true</https>
        <onlyDomain>true</onlyDomain>

        <connection>
            <socketTimeoutMilliseconds>10000</socketTimeoutMilliseconds>
            <connectionTimeout>10000</connectionTimeout>
            <maxTotalConnections>120</maxTotalConnections>
            <maxConnectionsPerHost>100</maxConnectionsPerHost>
            <maxDownloadSizePerPage>1048576</maxDownloadSizePerPage>
        </connection>

        <proxy>
            <proxyHost></proxyHost>
            <proxyPort></proxyPort>
            <proxyUsername></proxyUsername>
            <proxyPassword></proxyPassword>
        </proxy>

        <!-- job運行時效,-1表示直到爬完全部,60表示一個小時后job自動結束 -->
        <timeout>-1</timeout>
        <seeds>
            <seed>http://www.66e.cc</seed>
        </seeds>
        <urlFilters>
            <urlFileter value="http://www\.66e\.cc/\[a-zA-Z]+/\d{4}?/\d{2}/\w[^_]+\.html"/>
        </urlFilters>
        <selects>
            <!-- 選擇抓取的網頁類容 -->
            <select name="title" value="#title" />
            <select name="subTitle" value=".subTitle" />
        </selects>
    </job>

</jobs>

</conf></pre>

每一個job元素代表一個抓取工程,不同的job相互獨立。

如何使用

就這么簡單!!!

public static void main(String[] args) {
    JobConfigurationManager manager = new JobConfigurationManager();
    List<JobConfiguration> jobs;
    try {
        jobs = manager.loadJobConfigurations(
                new File("D:\\pioneer\\goodcrawler\\src\\main\\resources\\job_conf.xml"));
        for(JobConfiguration conf:jobs){
            // fetch
            FetchForeman.start(conf);
            // extract
            ExtractForeman.start(conf);
            // store
            StoreForeman.start(conf);
        }
    } catch (ConfigurationException e) {
         e.getMessage();
    }
}

沒有任何編碼負擔。

待解決的問題和以后的規劃

這個項目是一時興起的小玩物,目前的任務是完善和調整軟件結構,實現更多特性(session、form提交等等)。后期打算將url隊列單獨分離出來作為一個種子庫放在server Center上,爬取器和存儲器分散開來以實現分布式爬取。

項目主頁:http://www.baiduhome.net/lib/view/home/1373594209831

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!