我們的爬蟲主體框架思路如下
這一小節的主要內容是對我們之前編寫的**進行一些簡單的封裝,並且編寫部分engine
和parser
的**。下面的總體的結構圖
我們首先將之前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...
爬蟲 分布式爬蟲
爬蟲的本質 很多搞爬蟲的總愛吹噓分布式爬蟲,彷彿只有分布式才有逼格,不是分布式簡直不配叫爬蟲,這是一種很膚淺的思想。分布式只是提高爬蟲功能和效率的乙個環節而已,它從來不是爬蟲的本質東西。爬蟲的本質是網路請求和資料處理,如何穩定地訪問網頁拿到資料,如何精準地提取出高質量的資料才是核心問題。分布式爬蟲只...