栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

网络爬虫——GO

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网络爬虫——GO

这里写目录标题
  • go-colly网络爬虫框架
  • goquery HTML解析
      • goquery主要的结构
      • 怎么使用goquery
      • 常用选择器

go-colly网络爬虫框架

go-colly是用Go实现的网络爬虫框架。go-colly快速优雅,在单核上每秒可以发起1K以上请求;以回调函数的形式提供了一组接口,可以实现任意类型的爬虫。

Colly 特性:
清晰的API 快速(单个内核上的请求数大于1k) 管理每个域的请求延迟和最大并发数 自动cookie 和会话处理
同步/异步/并行抓取 高速缓存 自动处理非Unicode的编码 支持Robots.txt 定制Agent信息 定制抓取频次**

下载安装第三方包:
go get -u github.com/gocolly/colly/…

在代码中导入包:

import "github.com/gocolly/colly"

colly的主体是Collector对象,管理网络通信和负责在作业运行时执行附加的回调函数。使用colly需要先初始化Collector:

c := colly.NewCollector()

NewCollector,是变参函数,参数类型为函数类型func(*Collector),主要是用来初始化一个&Collector{}对象。

而在Colly中有好些函数都返回这个函数类型func(*Collector),如UserAgent(us string)用来设置UA。所以,这里其实是一种初始化对象,设置对象属性的一种模式。相比使用方法(set方法)这种传统方式来初始设置对象属性,采用回调函数的形式在Go语言中更灵活更方便:

NewCollector(options ...func(*Collector)) *Collector
UserAgent(ua string) func(*Collector)

一旦得到一个colly对象,可以向colly附加各种不同类型的回调函数(回调函数在Colly中广泛使用),来控制收集作业或获取信息,回调函数的调用顺序如下:

  1. OnRequest 在发起请求前被调用
  2. OnError 请求过程中如果发生错误被调用
  3. OnResponse 收到回复后被调用
  4. OnHTML 在OnResponse之后被调用,如果收到的内容是HTML
  5. OnScraped 在OnHTML之后被调用

例子:

package main

import (
    "fmt"

    "github.com/gocolly/colly"
)

func main() {
    // NewCollector(options ...func(*Collector)) *Collector
    // 声明初始化NewCollector对象时可以指定Agent,连接递归深度,URL过滤以及domain限制等
    c := colly.NewCollector(
        //colly.AllowedDomains("news.baidu.com"),
        colly.UserAgent("Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50"))

    // 发出请求时附的回调
    c.OnRequest(func(r *colly.Request) {
        // Request头部设定
        r.Headers.Set("Host", "baidu.com")
        r.Headers.Set("Connection", "keep-alive")
        r.Headers.Set("Accept", "**")
        r.Headers.Set("Origin", u.Host)
        r.Headers.Set("Referer", urlstr)
        r.Headers.Set("Accept-Encoding", "gzip, deflate")
        r.Headers.Set("Accept-Language", "zh-CN, zh;q=0.9")
    })

    c.OnHTML("title", func(e *colly.HTMLElement) {
        fmt.Println("title:", e.Text)
    })

    c.OnResponse(func(resp *colly.Response) {
        fmt.Println("response received", resp.StatusCode)

        // goquery直接读取resp.Body的内容
        htmlDoc, err := goquery.NewDocumentFromReader(bytes.NewReader(resp.Body))

        // 读取url再传给goquery,访问url读取内容,此处不建议使用
        // htmlDoc, err := goquery.NewDocument(resp.Request.URL.String())

        if err != nil {
            log.Fatal(err)
        }

        // 找到抓取项 
下所有的a解析 htmlDoc.Find(".hotnews a").Each(func(i int, s *goquery.Selection) { band, _ := s.Attr("href") title := s.Text() fmt.Printf("热点新闻 %d: %s - %sn", i, title, band) c.Visit(band) }) }) c.OnError(func(resp *colly.Response, errHttp error) { err = errHttp }) err = c.Visit(urlstr) }
常用选择器
  • HTML Element 元素的选择器 ID 选择器 Element ID 选择器 Find(element#id) Class选择器
  • Find(".class") 属性选择器
  • Find(“div[lang]“) 筛选含有lang属性的div元素
  • Find(“div[lang=zh]“) 筛选lang属性为zh的div元素
  • Find(“div[lang!=zh]“) 筛选lang属性不等于zh的div元素
  • Find(“div[lang¦=zh]“) 筛选lang属性为zh或者zh-开头的div元素
  • Find(“div[lang*=zh]“) 筛选lang属性包含zh这个字符串的div元素
  • Find(“div[lang~=zh]“) 筛选lang属性包含zh这个单词的div元素,单词以空格分开的
  • Find(“div[lang$=zh]“) 筛选lang属性以zh结尾的div元素,区分大小写
  • Find(“div[lang^=zh]“) 筛选lang属性以zh开头的div元素,区分大小写
  • parent>child选择器:如果我们想筛选出某个元素下符合条件的子元素,我们就可以使用子元素筛选器,它的语法为Find(“parent>child”),表示筛选parent这个父元素下,符合child这个条件的最直接(一级)的子元素。
  • prev+next相邻选择器:假设我们要筛选的元素没有规律,但是该元素的上一个元素有规律,我们就可以使用这种下一个相邻选择器来进行选择。
  • prev~next选择器:有相邻就有兄弟,兄弟选择器就不一定要求相邻了,只要他们共有一个父元素就可以。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/904220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号