第一篇我們做了乙個簡單的頁面廣度優先來抓取url,很顯然缺點有很多,第一:資料結構都是基於記憶體的,第二:單執行緒抓取
速度太慢,在實際開發中肯定不會這麼做的,起碼得要有序列化到硬碟的機制,對於整個爬蟲架構來說,構建好爬蟲佇列相當重要。
先上一幅我自己構思的架構圖,不是很完善,算是乙個雛形吧。
一:todo佇列和visited集合
在眾多的nosql資料庫中,mongodb還是很不錯的,這裡也就選擇它了,做集群,做分片輕而易舉。
二:**處理器
群架,鬥毆都是有帶頭的,那**處理器就可以幹這樣的事情,它的任務很簡單,
第一: 啟動時,根據我們定義好的規則將種子頁面分發到各個執行伺服器。
第二: 定時輪詢」todo——mongodb「,將讀取的新url根據規則分發到對應的執行伺服器中。
三:分發伺服器
**處理器將url分發到了執行伺服器的記憶體中,分發伺服器可以開啟10個執行緒依次讀取佇列來獲取url,然後解析url,
第一:如果url是外鏈,直接剔除。
第二:如果url不是本機負責抓取的,就放到」todo——mongodb「中。
第三:如果是本機負責的,將新提取的url放入本機記憶體佇列中。
四:**實現
待了,我要爬乙個美女**, ,申明一下,並非推廣**,看下」**處理器「的實現。
1接下來,我們開啟wcf服務,當然我們可以做10份,20份的copy,核心**如下:namespace
crawlercpu
2, stringsplitoptions.removeemptyentries)
22.tolist();
2324
factory.addrange(urls);
2526
//27
foreach (var item in
urls)
2829}30
31 console.writeline("
爬蟲 **處理器開啟,正在監視todo列表!");
3233
//開啟定時監視mongodb
34 timer timer = new
timer();
3536 timer.interval = 1000 * 10; //
10s輪詢一次
37 timer.elapsed += new
elapsedeventhandler(timer_elapsed);
38timer.start();
3940
console.read();41}
4243
static
void timer_elapsed(object
sender, elapsedeventargs e)
4470}71
}7273//
刪除mongodb中的todo表中指定資料
74mongodb.remove(urls);75}
76}77 }
1然後我們把」分發伺服器「和」**處理器「開啟:///2
///開始執行任務
3///
4public
static
void
start()5"
, todoqueue.count);
2122 tasks[j] = task.factory.startnew((obj) =>
23, currenturl);27}
28}29}
30}31 }
好了,稍等會,我們就會看到,資料已經嘩啦啦的往mongodb裡面跑了。
五:不足點
有的時候會出現某些機器非常free,而某些機器非常busy,這時就要實現雙工通訊了,當執行伺服器的記憶體佇列到達
乙個量級的時候就應該通知**處理器,要麼減緩對該執行伺服器的任務分發,要麼將任務分給其他的執行伺服器。
爬蟲管理平台以及wordpress本地搭建
各爬蟲管理平台了解 各爬蟲管理平台的本地搭建 windows下的wordpress搭建 scrapydweb 用於scrapyd實施管理的web應用程式,支援scrapy日誌分析和視覺化gerapy 基於scrapy,scrapyd,scrapyd client,scrapyd api,django...
小爬蟲系列
玩玩小爬蟲 抓取時的幾個小細節 摘要 這一篇我們聊聊在頁面抓取時應該注意到的幾個問題。一 網頁更新 我們知道,一般網頁中的資訊是不斷翻新的,這也要求我們定期的去抓這些新資訊,但是這個 定期 該怎麼理解,也就是多長時間需要抓一次該頁面,其實這個定期也就是頁面快取時間,在頁面的快取時間內我們再次抓取該網...
入門小爬蟲
python爬蟲最基本流程是,獲取請求,解析頁面,處理頁面資料 python獲取頁面的的第三方庫很多,像request,urllib,解析方法有最簡單的re正規表示式,也有專門用來解析的庫xmlx,beautifulsoup等。下面以request,正規表示式為例。一 獲取請求,得到網頁文字,先上 ...