在上一篇 Colly 入門(mén)中,我們已經(jīng)成功創(chuàng)建并運(yùn)行了第一個(gè) Colly 爬蟲(chóng)?,F(xiàn)在,讓我們進(jìn)一步學(xué)習(xí)如何通過(guò)配置 Colly,讓我們的爬蟲(chóng)機(jī)器人更加智能、高效,就好像給汽車(chē)換輪胎、升級(jí)引擎一樣,讓它的性能更上一層樓。編程獅(W3Cschool.cn)將繼續(xù)為你提供簡(jiǎn)單易懂的講解,讓你輕松掌握 Colly 的配置技巧。
在 Colly 中,收集器(Collector)就像是爬蟲(chóng)機(jī)器人的大腦,負(fù)責(zé)管理網(wǎng)絡(luò)通信和執(zhí)行各種任務(wù)。創(chuàng)建收集器的方法非常簡(jiǎn)單,只需要一行代碼:
c := colly.NewCollector()
這行代碼就像是給爬蟲(chóng)機(jī)器人安裝了一個(gè)最基礎(chǔ)的大腦,讓它具備了基本的爬取能力。
為了適應(yīng)不同的爬取任務(wù),我們可以對(duì)收集器進(jìn)行個(gè)性化配置,這就像是給爬蟲(chóng)機(jī)器人換上不同的裝備,讓它在不同的環(huán)境中都能出色完成任務(wù)。
不同的網(wǎng)站對(duì)訪問(wèn)者的身份有不同的要求。有時(shí)候,我們需要讓爬蟲(chóng)機(jī)器人偽裝成不同的瀏覽器,這就需要修改用戶(hù)代理(User-Agent)。代碼示例:
c := colly.NewCollector(
colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"),
)
這樣設(shè)置后,目標(biāo)網(wǎng)站就會(huì)認(rèn)為是常見(jiàn)的瀏覽器在訪問(wèn),而不是一個(gè)簡(jiǎn)單的爬蟲(chóng)程序。
在某些情況下,我們可能需要讓爬蟲(chóng)機(jī)器人多次訪問(wèn)同一個(gè)網(wǎng)址,這就需要開(kāi)啟允許重復(fù)訪問(wèn)網(wǎng)址的選項(xiàng)。代碼示例:
c := colly.NewCollector(
colly.AllowURLRevisit(),
)
或者,也可以在創(chuàng)建收集器后,直接修改其屬性:
c := colly.NewCollector()
c.AllowURLRevisit = true
為了更好地模擬真實(shí)的瀏覽器訪問(wèn)行為,我們還可以讓爬蟲(chóng)機(jī)器人在每次請(qǐng)求時(shí)隨機(jī)切換用戶(hù)代理。這就像是給爬蟲(chóng)機(jī)器人準(zhǔn)備了一套變裝道具,讓它每次訪問(wèn)都換一個(gè)身份。代碼示例:
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func RandomString() string {
b := make([]byte, rand.Intn(10)+10)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
return string(b)
}
c := colly.NewCollector()
c.OnRequest(func(r *colly.Request) {
r.Headers.Set("User-Agent", RandomString())
})
除了在代碼中直接配置收集器,我們還可以通過(guò)環(huán)境變量來(lái)配置,這就像是給爬蟲(chóng)機(jī)器人準(zhǔn)備了一套外部指令,讓它在不同的環(huán)境中都能靈活調(diào)整自己的行為。
如果我們只想讓爬蟲(chóng)機(jī)器人訪問(wèn)特定的域名,可以通過(guò)設(shè)置環(huán)境變量 COLLY_ALLOWED_DOMAINS
來(lái)實(shí)現(xiàn)。例如,在終端中運(yùn)行以下命令:
export COLLY_ALLOWED_DOMAINS="w3cschool.cn,www.yjpub.cn"
然后運(yùn)行爬蟲(chóng)程序,它就只會(huì)訪問(wèn)編程獅(W3Cschool.cn)網(wǎng)站及其子域名。
如果我們想禁止爬蟲(chóng)機(jī)器人訪問(wèn)某些域名,可以通過(guò)設(shè)置環(huán)境變量 COLLY_DISALLOWED_DOMAINS
來(lái)實(shí)現(xiàn)。例如:
export COLLY_DISALLOWED_DOMAINS="badwebsite.com,www.badwebsite.com"
這樣,爬蟲(chóng)機(jī)器人就不會(huì)訪問(wèn)這些被禁止的域名。
Colly 提供了許多其他的環(huán)境變量配置選項(xiàng),例如:
COLLY_CACHE_DIR
:設(shè)置緩存目錄COLLY_DETECT_CHARSET
:是否檢測(cè)字符集(y
表示是,n
表示否)COLLY_DISABLE_COOKIES
:是否禁用 cookies(y
表示是,n
表示否)COLLY_FOLLOW_REDIRECTS
:是否跟隨重定向(y
表示是,n
表示否)COLLY_MAX_BODY_SIZE
:設(shè)置最大響應(yīng)體大小COLLY_MAX_DEPTH
:設(shè)置最大爬取深度(0
表示無(wú)限深度)COLLY_USER_AGENT
:設(shè)置默認(rèn)的用戶(hù)代理這些環(huán)境變量就像是給爬蟲(chóng)機(jī)器人準(zhǔn)備的各種開(kāi)關(guān)和旋鈕,通過(guò)調(diào)整它們,可以讓爬蟲(chóng)機(jī)器人在不同的環(huán)境中都能表現(xiàn)出色。
為了提升爬蟲(chóng)機(jī)器人的性能,我們還可以對(duì) HTTP 連接進(jìn)行優(yōu)化,這就像是給汽車(chē)升級(jí)引擎,讓它跑得更快更穩(wěn)。
在網(wǎng)絡(luò)爬取過(guò)程中,可能會(huì)遇到網(wǎng)絡(luò)不穩(wěn)定的情況。為了防止爬蟲(chóng)機(jī)器人陷入無(wú)盡的等待,我們可以設(shè)置 HTTP 請(qǐng)求的超時(shí)時(shí)間。代碼示例:
c := colly.NewCollector()
c.WithTransport(&http.Transport{
DialContext: (&net.Dialer{
Timeout: 30 * time.Second, // 設(shè)置連接超時(shí)時(shí)間為 30 秒
KeepAlive: 30 * time.Second, // 設(shè)置連接保持活動(dòng)時(shí)間為 30 秒
}).DialContext,
TLSHandshakeTimeout: 10 * time.Second, // 設(shè)置 TLS 握手超時(shí)時(shí)間為 10 秒
})
在某些情況下,我們可能需要通過(guò)代理服務(wù)器來(lái)訪問(wèn)目標(biāo)網(wǎng)站,這就像是給爬蟲(chóng)機(jī)器人找了一個(gè)中間人,讓它通過(guò)中間人去訪問(wèn)目標(biāo)網(wǎng)站。代碼示例:
c := colly.NewCollector()
c.WithTransport(&http.Transport{
Proxy: http.ProxyFromEnvironment, // 使用環(huán)境變量中的代理服務(wù)器設(shè)置
})
除了上述基本配置,我們還可以通過(guò)一些進(jìn)階技巧,讓爬蟲(chóng)機(jī)器人更加智能、高效。
Colly 支持使用中間件來(lái)擴(kuò)展其功能,這就像是給爬蟲(chóng)機(jī)器人安裝插件,讓它具備更多的能力。例如,我們可以使用中間件來(lái)記錄每次請(qǐng)求的詳細(xì)信息:
c := colly.NewCollector()
c.Use(func(r *colly.Request) {
fmt.Println("Requesting", r.URL)
})
c.Use(func(r *colly.Response) {
fmt.Println("Visited", r.Request.URL)
})
對(duì)于一些需要 JavaScript 渲染的頁(yè)面,我們可以通過(guò)集成 Splash 等工具來(lái)處理,這就像是給爬蟲(chóng)機(jī)器人配備了一個(gè)能處理復(fù)雜網(wǎng)頁(yè)的智能引擎。代碼示例:
c := colly.NewCollector()
c.OnHTML("a.js-rendered", func(e *colly.HTMLElement) {
fmt.Println("Found JavaScript rendered link:", e.Text)
})
通過(guò)本篇文章,我們學(xué)習(xí)了如何通過(guò)個(gè)性化配置、環(huán)境變量設(shè)置以及 HTTP 優(yōu)化等方式,讓 Colly 爬蟲(chóng)機(jī)器人更加智能、高效?,F(xiàn)在,你可以嘗試結(jié)合這些配置技巧,去編程獅(W3Cschool.cn)網(wǎng)站上抓取更多有趣的數(shù)據(jù),比如熱門(mén)編程教程的標(biāo)題和鏈接,或者最新技術(shù)文章的作者和發(fā)布日期。
更多建議: