Go語言分布式網路爬蟲(1)

2021-09-24 17:31:57 字數 3069 閱讀 6832

我們的爬蟲主體框架思路如下

這一小節的主要內容是對我們之前編寫的**進行一些簡單的封裝,並且編寫部分engineparser的**。下面的總體的結構圖

我們首先將之前main中的業務邏輯封裝到fetch函式中,我們需要建立乙個新的包fetcher

接著我們就要開始編寫engine,首先建立乙個engine的包,然後建立乙個types檔案

}接著我們就要開始編寫parser,由於我們是建立58同城parser,所以我們新建立乙個58的包,然後再新增parser,建立檔案citylist.go,用於處理城市列表資訊

為了測試的必要,我們建立乙個空的url處理函式

// engine/types.go

func

nilparser([

]byte

) parseresult

}

將之前printcitylist函式中的**封裝到parsecitylist函式中。

// 58/parser/citylist.go

func

parsecitylist

(contents [

]byte

) engine.parseresult

re = regexp.

mustcompile

(`independentcitylist = ]*)`

) matches = re.

findallsubmatch

(contents,-1

)for

_, m :=

range matches )}

}}...return result

}

接著在engine包中建立engine.go檔案,我們先寫乙個run函式,用來處理接收到的request

// engine/engine.go

func

run(seeds ...request)

forlen

(requests)

>

0 parseresult := r.

parserfunc

(body)

requests =

(requests, parseresult.requests...

)for

_, item :=

range parseresult.items

}}

修改一下我們的main.go

func

main()

)}

最後我們執行一下**

接著我們需要編寫我們citylist.go檔案的測試檔案citylist_test.go,首先需要將我們訪問的網頁內容存為html檔案,方便我們的測試

接著編寫測試函式testparsecitylist

func

testparsecitylist

(t *testing.t)

result :=

parsecitylist

(contents)

const resultsize =

689 expectedurls :=

string

expectedcities :=

string

iflen

(result.requests)

!= resultsize

for i, url :=

range expectedurls }if

len(result.items)

!= resultsize

for i, city :=

range expectedcities

}}

測試結果如下

至此我們這一小節的內容完成,我們提交**到github

如果你覺得上述過程對你有一點困難,沒關係,可以檢視我的tiny-go-crawler lesson2**。

如有問題,希望大家指出!!!

Go語言分布式網路爬蟲(2)

好的,我們現在又回到了開始,我們之前只是獲取了不同城市的資訊,而我們的目的是獲取租房資訊 所以不難想到,我們需要編寫乙個功能類似於citylist.go的檔案。我們首先檢視租房金額,這個時候就有乙個問題了,我們發現這個租金是通過58同城的字型轉化過的,所以我們先要獲取字型資訊。我們新建乙個font包...

go 實現的分布式爬蟲

自學golang期間,編寫gorouting,chan相關 實現分布式爬去某主站的每個頁面的鏈結,暫未想到有什麼好辦法,在抓取完網頁上的鏈結後,自動退出程式。923550 923551 923552 923553 923554 923555 923556 923557 923558 923559 9...

爬蟲 分布式爬蟲

爬蟲的本質 很多搞爬蟲的總愛吹噓分布式爬蟲,彷彿只有分布式才有逼格,不是分布式簡直不配叫爬蟲,這是一種很膚淺的思想。分布式只是提高爬蟲功能和效率的乙個環節而已,它從來不是爬蟲的本質東西。爬蟲的本質是網路請求和資料處理,如何穩定地訪問網頁拿到資料,如何精準地提取出高質量的資料才是核心問題。分布式爬蟲只...