go-colly 官方文档翻译

未来有你 · · 1792 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简介(Introduction)

  • 如何安装?
如何安装
  1. Colly 只依赖于Go 语言,你可以通过 安装指南 安装它
  2. 安装Colly,在终端输入如下命令然后回车安装Colly
go get -u github.com/gocolly/colly/...
  • 入门
入门
  1. 开始使用Colly之前确保你已经安装最新版本,更详细内容见安装指南
  2. 让我们从一些简单的例子开始
  3. 首先你需要导入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)
})

回调函数执行顺序

  1. OnRequest
    在请求之前调用
  2. OnError
    在请求中出现错误时调用
  3. OnResponse
    响应接收到之后调用
  4. OnHTML
    OnResponse 正确执行后,如果接收到的文本是HTML时执行
  5. OnXML
    OnResponse 正确执行后,如果接收到的文本是XML时执行
  6. 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 存储项目

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:未来有你

查看原文:go-colly 官方文档翻译

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1792 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传