[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時就結束。
運行結果