Go语言爬虫笔记 1


[success]虽然Go根本就没学完,因为老是看了后面忘了前面,所以本着在项目中学习的理念,我就想直接上手,然后在慢慢学习,顺便做个笔记。
GO的爬虫框架我选择的是colly,因为目前资料实在太少,所以我就想直接看官方的英文文档,这里还能锻炼一下自己的英语水平,废话不多说,直接开始实战[/success]

文档地址:http://go-colly.org/docs/

安装

安装很简单,一行命令就可把包下载下来

[block]
go get -u github.com/gocolly/colly/…
[/block]

然而事情并没有想象中的那么简单,当我运行一个简单的demo时,一大堆报错。。提示我很多包都没有安装,无奈,按照提示一个一个的安装

[block]

go get -u github.com/temoto/robotstxt
go get -u golang.org/x/text/encoding
go get -u golang.org/x/text/encoding/charmap 
go get -u golang.org/x/text/encoding/htmlindex
go get -u golang.org/x/text/transform

[/block]

安装好这些包后,我们来测试一个简单的demo

[highlight lanaguage=”Go”]

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
", 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/")
}

[/highlight]

这个demo的作用就是,依次把这个网站的所有超链接都找出来

大概就是下面这个样子

回调函数

想要使用colly非常简单,只需要下面一行代码声明就可以了。

[block]

c := colly.NewCollector()

[/block]

colly有下面的几个回调函数。

[highlight lanaguage=”Go”]

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)
})

[/highlight]

  1. OnRequest 在发起请求前被调用

  2. OnError 请求过程中如果发生错误被调用

  3. OnResponse 收到回复后被调用

  4. OnHTML 在OnResponse被调用后,如果收到的内容是HTML,调用OnHTML函数

  5. OnXML 在OnHTML被调用后,如果收到的内容是XML或者HTML

  6. OnScraped 在OnXML之后被调用

虽然回调函数有很多,但是实际上用的到的也只有几个而已。

请求头设置

请求头是爬虫的一个非常重要的伪装手段,所以也是我们必须掌握的一个地方,当然,colly的请求头还是比较简单的。

我们需要用到回调函数来设置请求头(下面这个只是举了一些例子,大家可以自由添加)

[highlight lanaguage=”Go”]

c.OnRequest(func(r *colly.Request) {
    r.Headers.Set("Host", "query.sse.com.cn")
    r.Headers.Set("Connection", "keep-alive")
    r.Headers.Set("Accept-Encoding", "gzip, deflate")
    r.Headers.Set("Accept-Language", "zh-CN,zh;q=0.9")
})
//还有一个重要的请求头(这个不需要回调函数)
c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"

[/highlight]

jQuery选择器

爬虫最重要的不是怎么爬,而是如何对爬到的原始数据进行筛选,找出自己需要的数据,colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中。如果要灵活自如地采集数据,首先要了解jQuery选择器,我只是挑一些重点的部分来讲,其他的自己参考官方文档。

 *

选择所有的元素,这里会把所有的元素都解析好,然后你就可以获得所有的数据了。

[name|='value']

选择元素的指定属性的值等于给定的字符串或字符串开始,后跟一个连字符(-)

类似的还有

[name*=”value”] 属性值包含该字符串

[name~=”value”] 包含这个单词

[name$=”value”] 以这个字符串结束,区分大小写

[name=”value”] 属性等于这个值

[name!=”value”] 属性不包含这个值

[name^=”value”] 选择具有指定属性的元素,其值的开始部分与给定字符串完全一致。

这几个我没有一一试过,大家可以自己选几个试试。我这里简单举个例子:选择所有class为panel的标签: [class='panel']

:button

按钮选择器,选择所有的按钮。类似的还有

:checkbox 选择所有的多选框

:checked 选择所有的单选框

:image 选择所有的图片

:input  选择所有的标签

这个我不多讲,好像我这边测试没用223。。

parent > child

父子选择器,这个也是用的非常多的一个,就是在父元素的前提下在选择子元素,说这个也不一定听的懂,我这里直接举一个例子:

选择clas为a标签里面的一个class为b标签的元素:[class=’a’] > [class=’b’]

.class

class选择器,这个和属性选择器原理是差不多的,不过这个是专门选择class元素,而且语法也更简洁。比如我选择所有class为a的元素 :.a

:contains()

包含选择器,这个就是选择包含某一个文本的标签。比如我要选择class为a所有标签中内容为hello的标签:.a:contains(hello)

:disabled

选择所有被禁用的元素,这里就是选择那些被禁用的标签,比如这个:<input name="email" disabled="disabled">

还有一个类似的 :enabled 这个是选择没有被禁用的元素

element

元素选择器,这个很简单,就是选择所有的这个元素:比如选择所有h2标签:h2

:empty

空元素选择器,这个是选择所有标签内内容为空的元素

#id

id选择器,选择所有对应的id。这个也很简单,比如选择所有id为test的元素:#test

还有其他的,可以自己参考官网的所有选择器,这里我也没有那么多时间一个个仔细的测试。

简单实战

我们前面学了一些很重要很基础的东西,下面我们其实就可以开始实战了,我们要做的事情很简单,就是简单模拟一下浏览器获取一章小说的数据。

这里我随便找了一个网站拿来实战:https://www.tianxiabachang.cn/5_5166/2013982.html

代码展示

[highlight lanaguage="Go"]
package main

import (
“fmt”
“github.com/gocolly/colly”
)

func main() {
c := colly.NewCollector()
c.UserAgent=”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36”
c.OnRequest(func(r *colly.Request) {
r.Headers.Set(“Referer”,”https://www.tianxiabachang.cn/5_5166/“)
})
c.OnHTML(“#content”, func(e *colly.HTMLElement) {
fmt.Println(e.Text)
})
c.Visit(“https://www.tianxiabachang.cn/5_5166/2013982.html“)
}


[/highlight]

实际效果

到这里,我们算是掌握了非常基础的爬虫,下面我们会正式准备进阶,准备更复杂的操作。

参考文章

1.colly官方文档

2.Golang 网络爬虫框架gocolly/colly 四

3.jQuery选择器官方文档

 


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录