不少同窗加羣都在問, 如何使用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時就結束。