[開源 .NET 跨平台 Crawler 數據采集 爬蟲框架: DotnetSpider] [五] 如何做全站采集?


[DotnetSpider 系列目錄]

如何做全站采集?

很多同學加群都在問, 如何使用DotnetSpider做全站采集呢? 其實很簡單, 只要你們想通爬蟲的整個邏輯就能明白了。簡而言之,步驟如下:

1. 使用指定URL下載HTML

2. 分析, 保存HTML數據

3. 從HTML中分析出符合規則的新的URL, 並用新URL重復 1,2,3步驟, 直到再也無法發現新的URL

邏輯是簡單的, 但其中涉及到的細節不少,如多線程、URL去重、遍歷深度等, 但是不用擔心, 這些也正是框架應該去做的事情, 大家只需要關注業務邏輯就好。

 

下載代碼

https://github.com/zlzforever/DotnetSpider

請下載代碼后, 找到DotnetSpider.Sample里的BaseUsage.cs中的CrawlerPagesTraversal方法

復制代碼
        public static void CrawlerPagesTraversal()
        {
            // Config encoding, header, cookie, proxy etc... 定義采集的 Site 對象, 設置 Header、Cookie、代理等
            var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };

            // Set start/seed url
            site.AddStartUrl("http://www.cnblogs.com/");

            Spider spider = Spider.Create(site,
                // crawler identity
                "cnblogs_" + DateTime.Now.ToString("yyyyMMddhhmmss"),
                // use memoery queue scheduler
                new QueueDuplicateRemovedScheduler(),
                // default page processor will save whole html, and extract urls to target urls via regex
                new DefaultPageProcessor("cnblogs\\.com"))
                // save crawler result to file in the folder: \{running directory}\data\{crawler identity}\{guid}.dsd
                .AddPipeline(new FilePipeline())
                // dowload html by http client
                .SetDownloader(new HttpClientDownloader())
                // 4 threads 4線程
                .SetThreadNum(4);

            // traversal deep 遍歷深度
            spider.Deep = 3;

            // stop crawler if it can't get url from the scheduler after 30000 ms 當爬蟲連續30秒無法從調度中心取得需要采集的鏈接時結束.
            spider.EmptySleepTime = 30000;

            // start crawler 啟動爬蟲
            spider.Run();
        }
復制代碼

 

設置站點對象

Site對象是用來設置對采集對象統一使用的配置, 如Encoding, Cookie, Proxy, 頁面是否壓縮等等, 一般大家可以直接使用默認值就可以了, 除非發現數據采集異常, 再去嘗試修正

起始鏈接

采集一個站點, 當然需要一個入口,這個入口一般可以是網站首頁。當然如果你們要從某個類別等進入,甚至是多個入口都是可以的。調用AddStartUrl添加就可以了

            site.AddStartUrl("http://www.cnblogs.com/");

創建爬蟲

復制代碼
            Spider spider = Spider.Create(site,
                // crawler identity
                "cnblogs_" + DateTime.Now.ToString("yyyyMMddhhmmss"),
                // use memoery queue scheduler
                new QueueDuplicateRemovedScheduler(),
                // default page processor will save whole html, and extract urls to target urls via regex
                new DefaultPageProcessor("cnblogs\\.com"))
                // save crawler result to file in the folder: \{running directory}\data\{crawler identity}\{guid}.dsd
                .AddPipeline(new FilePipeline())
                // dowload html by http client
                .SetDownloader(new HttpClientDownloader())
                // 4 threads 4線程
                .SetThreadNum(4);
復制代碼

如上代碼, 調用靜態方法Spider.Create(有多個重載), 給的參數是站點對象、采集任務標識、調度隊列(如果引用了DotnetSpider.Extension可以使用Redis做隊列實現分布式采集)

DefaultPageProcessor: 構造參數是一個正則表達式, 用此正則來篩選需要采集的URL

FilePipeline: 默認實現的文件存儲HTML信息, 大家可以自行實現IPipeline傳入

HttpClientDownloader: 默認實現的Http下載器, 僅用於下載HTML

 

設置遍歷深度及結束條件

            // traversal deep 遍歷深度
            spider.Deep = 3;

            // stop crawler if it can't get url from the scheduler after 30000 ms 當爬蟲連續30秒無法從調度中心取得需要采集的鏈接時結束.
            spider.EmptySleepTime = 30000;

 

EmptySleepTime是指當爬蟲多久發現不了新的URL時就結束。

 

運行結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM