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

[DotnetSpider 系列目錄]

如何作全站採集?

不少同窗加羣都在問, 如何使用DotnetSpider作全站採集呢? 其實很簡單, 只要大家想通爬蟲的整個邏輯就能明白了。簡而言之,步驟以下:html

1. 使用指定URL下載HTMLgit

2. 分析, 保存HTML數據github

3. 從HTML中分析出符合規則的新的URL, 並用新URL重複 1,2,3步驟, 直到再也沒法發現新的URL正則表達式

邏輯是簡單的, 但其中涉及到的細節很多,如多線程、URL去重、遍歷深度等, 可是不用擔憂, 這些也正是框架應該去作的事情, 你們只須要關注業務邏輯就好。cookie

 

下載代碼

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作隊列實現分佈式採集)ide

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時就結束。

 

運行結果

相關文章
相關標籤/搜索