好的,我們現在又回到了開始,我們之前只是獲取了不同城市的資訊,而我們的目的是獲取租房資訊
所以不難想到,我們需要編寫乙個功能類似於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...
爬蟲 分布式爬蟲
爬蟲的本質 很多搞爬蟲的總愛吹噓分布式爬蟲,彷彿只有分布式才有逼格,不是分布式簡直不配叫爬蟲,這是一種很膚淺的思想。分布式只是提高爬蟲功能和效率的乙個環節而已,它從來不是爬蟲的本質東西。爬蟲的本質是網路請求和資料處理,如何穩定地訪問網頁拿到資料,如何精準地提取出高質量的資料才是核心問題。分布式爬蟲只...