框架 go_Colly - 优雅极速的Go语言爬虫框架
寫爬蟲,Python 是目前的第一選擇,但總覺得 Python 太慢了,而且缺乏靜態類型。能不能換 Go 語言來試試呢?Colly,這個既優雅又快速的 Go 語言爬蟲框架,是你的不二選擇。
爬蟲框架
簡介
Colly,是 gocolly 組織在 Github 上開源的 Go 語言爬蟲框架,代碼倉庫在 https://github.com/gocolly/colly,目前版本為 2.1.0。Colly 具有簡潔的 API 設計;性能優越,單核上能達超越每秒一千請求;具備同步、異步和并行模式;支持緩存,能管理請求延遲和最大并發數;自動的 Cookie 和 Session 處理;自動的非 Unicode 響應編碼處理;支持分布式爬取等等。
Colly框架
安裝
使用 go get 直接安裝:
go get -u github.com/gocolly/colly/v2示例
我們首先來看一個簡單的例子:
package mainimport ( "fmt" "github.com/gocolly/colly/v2")func main() { // 初始化默認的收集器 c := colly.NewCollector( // 設置只訪問設定的域名 colly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"), ) // 對于每一個包含href屬性的a元素,執行回調 c.OnHTML("a[href]", func(e *colly.HTMLElement) { link := e.Attr("href") // 輸出鏈接 fmt.Printf("Link found: %q -> %s", e.Text, link) // 訪問鏈接 c.Visit(e.Request.AbsoluteURL(link)) }) // 在進行每個請求前輸出URL c.OnRequest(func(r *colly.Request) { fmt.Println("Visiting", r.URL.String()) }) // 開始爬取 c.Visit("https://hackerspaces.org/")}可以看到,Colly 主要使用收集器 Collector 作為主界面進行爬取,首先進行了 Collector 的實例化,并進行了相關配置,限制了爬取過程的域名,防止爬取到其他網站。
然后,使用回調函數的掛載實現爬取過程中的處理。使用 OnHTML 實現對于特定 HTML 元素的處理,獲取頁面上所有鏈接,并進行遞歸訪問;使用 OnRequest 實現對于每一個請求的處理,進行請求信息的輸出。
最后,使用收集器的 Visit 接口開始第一個頁面爬取,啟動了爬蟲。
我們可以對訪問的 URL 進行更為復雜的篩選,使用 Colly 的 URLFilters:
c := colly.NewCollector(// Visit only root url and urls which start with "e" or "h" on httpbin.orgcolly.URLFilters(regexp.MustCompile("http://httpbin.org/(|e.+)$"),regexp.MustCompile("http://httpbin.org/h.+"),),)此外,Colly 對于 HTTP 代理有很好的支持,可以支持代理列表的自動輪轉選擇:
rp, err := proxy.RoundRobinProxySwitcher("socks5://127.0.0.1:1337", "socks5://127.0.0.1:1338")c.SetProxyFunc(rp)RoundRobinProxySwitcher 實現了對于兩個 SOCKS 代理的輪流使用。
另外,可以使用 Redis 作為存儲實現一個請求隊列以控制并發:
package mainimport ( "log" "github.com/gocolly/colly" "github.com/gocolly/colly/queue" "github.com/gocolly/redisstorage")func main() { urls := []string{ "http://httpbin.org/", "http://httpbin.org/ip", "http://httpbin.org/cookies/set?a=b&c=d", "http://httpbin.org/cookies", } c := colly.NewCollector() // 創建Redis儲存 storage := &redisstorage.Storage{ Address: "127.0.0.1:6379", Password: "", DB: 0, Prefix: "httpbin_test", } // 添加儲存到收集器 err := c.SetStorage(storage) if err != nil { panic(err) } // 清空存儲 if err := storage.Clear(); err != nil { log.Fatal(err) } defer storage.Client.Close() // 創建一個新的請求隊列 q, _ := queue.New(2, storage) c.OnResponse(func(r *colly.Response) { log.Println("Cookies:", c.Cookies(r.Request.URL.String())) }) // 把URL添加到隊列 for _, u := range urls { q.AddURL(u) } // 消費請求 q.Run(c)}代碼使用了 redisstorage 創建了一個 Redis 后端的存儲,然后創建了一個具有2個消費者線程的隊列。把所有初始的 URL 添加到隊列中,并開始消費,消費者從隊列中取出 URL 開始執行爬取工作。
爬蟲框架
總結
Colly 作為一個爬蟲框架,接口設計簡潔優雅,功能豐富,可以在多種數據收集場景中發揮作用,且無論是開發效率還是運行效率都非常高,實用價值高。
Colly 開源貢獻眾多,社區活躍,目前已被許多開發者在實踐中使用。Colly 文檔完善,例子豐富,包括了爬取 Coursera、Instagram、Reddit 等網站的示例,方便學習者參考使用。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的框架 go_Colly - 优雅极速的Go语言爬虫框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle备份还原到本地_RMAN备份
- 下一篇: cannot resolve symbo