colly是用golang實現(xiàn)的一款常用的爬蟲框架护昧。它的主要特點是輕量莫其、快速癞尚,設(shè)計非常優(yōu)雅,并且分布式的支持也非常簡單榜配,易于擴展否纬。
如何安裝colly?
colly安裝的唯一先決條件:已安裝go的編程環(huán)境(畢竟是面向go語言的爬蟲框架)
然后僅需使用一行g(shù)o get命令即可完成安裝:
# 省略號是你想要安裝的版本
# 如:github.com/gocolly/colly/v2
go get -u github.com/gocolly/colly/...
快速上手
安裝完成之后蛋褥,筆者借官方的demo來體驗colly的基礎(chǔ)使用方法临燃。附官方文檔的鏈接:官方文檔
1. 導(dǎo)入colly模塊
import "github.com/gocolly/colly/v2"
2.使用默認(rèn)的配置創(chuàng)建收集器
c := colly.NewCollector()
NewCollector()方法內(nèi)可以添加參數(shù)以更改收集器的配置。作為初學(xué)者烙心,這里暫時不作討論膜廊。
3.事件監(jiān)聽
事件監(jiān)聽,就是通過callbacks處理相關(guān)的事件淫茵。
將回調(diào)函數(shù)添加到收集器的事件監(jiān)聽函數(shù)中以控制收集的任務(wù)或搜索特點的信息爪瓜。例如使用c.OnHTML,收集器就會遍歷所有的html標(biāo)簽匙瘪。
// 遍歷所有的a標(biāo)簽铆铆,如果有href屬性就回調(diào)
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
fmt.Printf("Link found: %q -> %s\n", e.Text, link)
c.Visit(e.Request.AbsoluteURL(link))
})
// 在請求之前打印“Visiting xxx”
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
這里列舉一下相關(guān)的事件類型:
- OnRequest 在請求之前調(diào)用
- OnError 如果在請求期間發(fā)生錯誤蝶缀,則調(diào)用
- OnResponseHeaders 在接收到響應(yīng)頭之后調(diào)用
- OnResponse 在收到回復(fù)后調(diào)用
- OnHTML 如果接收到的內(nèi)容是 HTML,則在 OnResponse 之后立即調(diào)用
- OnXML 如果接收到的內(nèi)容是 HTML 或 XML薄货,則在 OnHTML 之后調(diào)用
- OnScraped 在 OnXML 回調(diào)之后調(diào)用
4.指定收集器啟動時應(yīng)訪問的URL
c.Visit("https://hackerspaces.org/")
完整的代碼
package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
// Instantiate default collector
c := colly.NewCollector(
// Visit only domains: hackerspaces.org, wiki.hackerspaces.org
colly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"),
)
// On every a element which has href attribute call callback
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
// Print link
fmt.Printf("Link found: %q -> %s\n", e.Text, link)
// Visit link found on page
// Only those links are visited which are in AllowedDomains
c.Visit(e.Request.AbsoluteURL(link))
})
// Before making a request print "Visiting ..."
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
// Start scraping on https://hackerspaces.org
c.Visit("https://hackerspaces.org/")
}
執(zhí)行程序可以清晰地看到翁都,在對指定URL訪問前先打印了“Visiting xxx”,然后爬取網(wǎng)頁中a標(biāo)簽的href屬性谅猾,并打印到控制臺柄慰,如截圖所示,https://wiki.hackerspaces.org網(wǎng)頁中有一個a標(biāo)簽內(nèi)容為navigation税娜,其href屬性為#column-one坐搔。
結(jié)語
可以看到colly的爬蟲框架非常簡潔,結(jié)合go的并發(fā)特征敬矩,會給爬蟲帶來很高的效率概行。美中不足的是目前文檔不是很多,需要持續(xù)地消化谤绳。