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

2021-09-24 19:30:34 字數 4111 閱讀 2251

好的,我們現在又回到了開始,我們之前只是獲取了不同城市的資訊,而我們的目的是獲取租房資訊

所以不難想到,我們需要編寫乙個功能類似於citylist.go的檔案。我們首先檢視租房金額,這個時候就有乙個問題了,我們發現這個租金是通過58同城的字型轉化過的,所以我們先要獲取字型資訊。

我們新建乙個font包,用於獲取字型資訊

const fontname =

"online_font.ttf"

func

getfontfile

(contents [

]byte)if

_, err := os.

stat

(fontname)

;!os.

i***ist

(err)

fontfile.

write

(bs4tostr)

}}

接著我們需要通過這個字型檔案,將我們獲取的文字編碼轉化過來。我在go語言的包中沒有找到好用的字型處理的包,所以我使用python中的fonttools的到了下面的對映關係(至於go下要怎麼處理,後面再想辦法)

fonttounicode :=

map[

string

]string

首先我們先要將獲取的字型轉化為正常的編碼,我們將轉化函式寫到engine.go檔案中

// engine/engine.go

func

run(seeds ...request)

}func

parsehtmlwithfont

(contents *

byte

)for k, v :=

range fonttounicode

*contents = bytes.

replace

(*contents,

byte

(" "),

byte(""

),-1

)}

為了能夠描述租房的情況,我們建立乙個資料結構用來存放租房資訊,為此我們需要新建立乙個包model,然後建立檔案profile.go

//model/profile.go

type profile struct

接著我們在58/parser目錄下新建乙個profile.go檔案用於處理這些資訊,主要是通過一系列的正規表示式解析內容

// 58/parser/profile.go

var rentre = regexp.

mustcompile

(`[^>]*>(\d*)`

)...

func

parseprofile

(contents [

]byte

, name string

) engine.parseresult

profile.name = name

rent, err := strconv.

atoi

(extractstring

(contents, rentre)

)if err ==

nil profile.rentalmethod =

extractstring

(contents, rentalmethodre)

... result := engine.parseresult,}

return result

}func

extractstring

(contents [

]byte

, re *regexp.regexp)

string

else

}

接著我們需要獲取該城市有哪些服務

這裡為了簡單處理,我們只獲取租房服務。我們在parser目錄下新建乙個city.go檔案

// 58/parser/city.go

var localre = regexp.

mustcompile

(`locallist:.*listname: '([^']*)'}`

)var renthousere = regexp.

mustcompile

(`]*>租房`

}

接著我們需要編寫服務去遍歷租房列表

我們在parser目錄下新建乙個renthouse.go檔案

var renthouselistre = regexp.

mustcompile

(`[^=]*="([^"]*)"[^>]*>([^

)func

parserenthouse

(contents [

]byte

) engine.parseresult

matches := renthouselistre.

findallsubmatch

(contents,-1

)for

_, m :=

range matches )}

return result

}

好的,讓我們看一下我們的成果吧_

至此我們這一小節的內容完成,我們提交**到github。但是這裡還有乙個小bug,還記得我通過python的包fonttools獲取的字典表嗎?在實際測試中,我發現這個字典是不斷變換的,也就是說我們需要動態獲取這個字典。那麼如果通過go去動態獲得這個字典,我暫時還沒有好的辦法。(⊙﹏⊙)b

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

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

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

我們的爬蟲主體框架思路如下 這一小節的主要內容是對我們之前編寫的 進行一些簡單的封裝,並且編寫部分engine和parser的 下面的總體的結構圖 我們首先將之前main中的業務邏輯封裝到fetch函式中,我們需要建立乙個新的包fetcher 接著我們就要開始編寫engine,首先建立乙個engin...

go 實現的分布式爬蟲

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

爬蟲 分布式爬蟲

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