介绍
章节以案例为主,搭载少量的解说.
本章节介绍基本的使用,获取网页的信息.
请求执行之前调用
- OnRequest
响应返回之后调用
- OnResponse
监听执行 selector
- OnHTML
监听执行 selector
- OnXML
错误回调
- OnError
完成抓取后执行,完成所有工作后执行
- OnScraped
取消监听,参数为 selector 字符串
- OnHTMLDetach
取消监听,参数为 selector 字符串
- OnXMLDetach
demo
package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
// 实例化默认收集器
c := colly.NewCollector()
// 仅访问域
c.AllowedDomains = []string{"quotes.toscrape.com"}
// 表示抓取时异步的
c.Async = true
// 模拟浏览器
c.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
// 限制采集规则
/*
在Colly里面非常方便控制并发度,只抓取符合某个(些)规则的URLS
colly.LimitRule{DomainGlob: "*.douban.*", Parallelism: 5},表示限制只抓取域名是douban(域名后缀和二级域名不限制)的地址,当然还支持正则匹配某些符合的 URLS
Limit方法中也限制了并发是5。为什么要控制并发度呢?因为抓取的瓶颈往往来自对方网站的抓取频率的限制,如果在一段时间内达到某个抓取频率很容易被封,所以我们要控制抓取的频率。
另外为了不给对方网站带来额外的压力和资源消耗,也应该控制你的抓取机制。
*/
// err := c.session.Limit(&colly.LimitRule{DomainGlob: "*.quotes.*", Parallelism: 5})
// if err != nil {
// fmt.Println(err)
// }
// 访问地址
url := "http://quotes.toscrape.com"
c.OnHTML(".pager .next a", func(e *colly.HTMLElement) {
// 获取属性值
link := e.Attr("href")
fmt.Printf("Link found: %q -> %s\n", e.Text, link)
})
c.OnError(func(_ *colly.Response, err error) {
fmt.Println("Something went wrong:", err)
})
// 结束
c.OnScraped(func(r *colly.Response) {
fmt.Println("Finished", r.Request.URL)
})
// 开始爬取 url
err2 := c.Visit(url)
if err2 != nil {
fmt.Println("err2", err2)
}
// 采集等待结束
c.Wait()
}