简介(Introduction)
-
如何安装?
如何安装
- Colly 只依赖于Go 语言,你可以通过 安装指南 安装它
- 安装Colly,在终端输入如下命令然后回车安装Colly
go get -u github.com/gocolly/colly/...
-
入门
入门
- 开始使用Colly之前确保你已经安装最新版本,更详细内容见安装指南
- 让我们从一些简单的例子开始
- 首先你需要导入Colly到你的代码中
import "github.com/gocolly/colly"
收集器
Colly 的主要实例是收集器对象,当Colly 收集器任务运行时,收集器负责网络通讯和执行附加的回调任务。你必须初始化收集器
c := colly.NewCollector()
回调
你可以把不同类型的回调函数附加到收集器上来控制收集任务,然后取回信息,你可以在包文档中查看相关章节
添加回调到收集器中
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL)
})
c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong:", err)
})
c.OnResponse(func(r *colly.Response) {
fmt.Println("Visited", r.Request.URL)
})
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
e.Request.Visit(e.Attr("href"))
})
c.OnHTML("tr td:nth-of-type(1)", func(e *colly.HTMLElement) {
fmt.Println("First column of a table row:", e.Text)
})
c.OnXML("//h1", func(e *colly.XMLElement) {
fmt.Println(e.Text)
})
c.OnScraped(func(r *colly.Response) {
fmt.Println("Finished", r.Request.URL)
})
回调函数执行顺序
- OnRequest
在请求之前调用 - OnError
在请求中出现错误时调用 - OnResponse
响应接收到之后调用 - OnHTML
OnResponse 正确执行后,如果接收到的文本是HTML时执行 - OnXML
OnResponse 正确执行后,如果接收到的文本是XML时执行 - OnScraped
OnXML 回调后调用
-
配置
配置
Colly 是一个高度自定义的爬虫框架,它提供合理的默认配置,而且提供了大量的配置去改变它
收集器配置
全面的收集器属性列表可以在这儿查看,推荐使用colly.NewCollector(options...)这种方法来初始化收集器
使用默认配置创建一个收集器
c1 := colly.NewCollector()
创建另外一个收集器,改变User-Agent 和 Url Revisit
c2 := colly.NewCollector(
colly.UserAgent("xy"),
colly.AllowURLRevisit(),
)
或者
c2 := colly.NewCollector()
c2.UserAgent = "xy"
c2.AllowURLRevisit = true
通过重新设置收集器的属性可以在收集任务运行任何节点改变配置。
一个很好的例子是 User-Agent 切换器,在每个请求上改变User-Agent
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())
})
通过环境变量配置
收集器的默认配置可以通过环境变量来改变,它允许我们在不通过编译的情况下对配置进行微调
环境变量解析是在收集器初始化的最后一步执行,所以每个变量在初始化后的改变都可能被环境变量配置覆盖。
环境变量配置
- ALLOWED_DOMAINS (多个域名用逗号分割)
- CACHE_DIR (string)
- DETECT_CHARSET (y/n)
- DISABLE_COOKIES (y/n)
- DISALLOWED_DOMAINS (多个域名用逗号分割)
- IGNORE_ROBOTSTXT (y/n)
- MAX_BODY_SIZE (int)
- MAX_DEPTH (int - 0 没有限制)
- PARSE_HTTP_ERROR_RESPONSE (y/n)
- USER_AGENT (string)
HTTP 配置
Colly 使用golang的 http client 作为网络层,HTTP设置可以通过改变默认的HTTP roundtripper来调整
c := colly.NewCollector()
c.WithTransport(&http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}).DialContext,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
最佳实践(Best Practices)
-
调试
-
分布式抓取
-
后端存储
-
使用多个收集器
-
爬虫配置
-
扩展
案例(Examples)
-
基础
-
错误处理
-
登录
-
最大深度
-
多部件
-
并行
-
代理选择器
-
队列
-
随机延迟
-
速率限制
-
后端Redis
-
请求上下文
-
爬虫服务器
-
Url过滤器
现实案例(Real Life Examples)
-
加密市场存储
-
Coursera 课程
-
FactBase
-
Google 集团
-
黑客新手评论
-
Instagram 图片
-
Openedx 课程
-
Reddit 网
-
购物网站地图
-
Xkcd 存储项目
有疑问加站长微信联系(非本文作者)