在單機版的基礎上,將耗時最長,等待時間做多的進行併發 ,也就是fetch模組
fetch的輸出就是parse的輸入,也就是可以把fetch和parse合成乙個模組 -- worker模組
}然後worker這一塊,就可以用併發來實現:
worker輸入是request,輸出是乙個request + items
加入乙個scheduler,也就是對任務的排程器,簡單來講的就是engine原來把request交給任務列表,現在交給scheduler
按照這個併發結構,
併發版爬蟲的關鍵在於實現scheduler,怎麼把request進行分發
併發之後變快了,原因在於fetch操作是在worker裡進行的,而且是10個worker一起進行。
fetch操作結束後,parse會交給engine新的request,engine將request放在scheduler中,scheduler將等到有空閒的worker可以接受in通道的request。雖然10個worker公用乙個in通道,但是卻可以同時處理很多request。不需要等乙個request處理完了再處理下乙個
但是這種做法有乙個問題,那就是schedule必須等到有空閒的worker來接收scheduler寫入in通道的東西。但是有可能的問題是當從out中取出乙個結果時,對應要往in通道寫入多個。這就會導致in通道可能會一直等空閒的worker來讀而卡在那裡。如下,就會卡在那裡
func gofunc(in chan int, out chan int )
}() }}
func main()
}
解決的辦法就是:
GO 併發的網路爬蟲
第一頁 ie utf 8 pn 0 第二頁 ie utf 8 pn 50 第三頁 ie utf 8 pn 100 整體提取的思路 1 先拿位址 2 爬 3 取 4 存 讀取網頁的body內容 buf make byte,4 1024 fortrue else result string buf n ...
GO寫網路爬蟲 單任務版架構設計
說是架構設計,但是爬蟲框架大同小異,這裡也是說明一下原理,把之前做的一些功能給模組化到架構中。先上個圖吧 這就是引擎中各元件的任務職能,各施其職發揮出種元件的特點 1 種子就是原始url沒什麼好說明的 2 爬蟲引擎 對爬蟲種子或其它任務進行排程 3 網頁獲取器 主要任務是對網頁內容進行讀取,包括網頁...
go語言實現網路併發爬蟲
爬蟲的四個主要步驟 1 明確目標 要知道你準備在哪個範圍或者 去搜尋 2 爬 將所有的 的內容全部爬下來 3 取 去掉對我們沒用處的資料 4 處理資料 按照我們想要的方式儲存和使用 爬取網頁內容 讀取網頁的body內容 buf make byte,1024 4 forresult string bu...