[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]
OnRequest 在发起请求前被调用
OnError 请求过程中如果发生错误被调用
OnResponse 收到回复后被调用
OnHTML 在OnResponse被调用后,如果收到的内容是HTML,调用OnHTML函数
OnXML 在OnHTML被调用后,如果收到的内容是XML或者HTML
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']
选择元素的指定属性的值等于给定的字符串或字符串开始,后跟一个连字符(-)类似的还有
这几个我没有一一试过,大家可以自己选几个试试。我这里简单举个例子:选择所有class为panel的标签: [class='panel'][name*=”value”] 属性值包含该字符串
[name~=”value”] 包含这个单词
[name$=”value”] 以这个字符串结束,区分大小写
[name=”value”] 属性等于这个值
[name!=”value”] 属性不包含这个值
[name^=”value”] 选择具有指定属性的元素,其值的开始部分与给定字符串完全一致。
:button
按钮选择器,选择所有的按钮。类似的还有这个我不多讲,好像我这边测试没用223。。:checkbox 选择所有的多选框
:checked 选择所有的单选框
:image 选择所有的图片
:input 选择所有的标签
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 mainimport (
“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 四