关于chrome:Golangchromedpgoquery-简单爬取动态数据

55次阅读

共计 4770 个字符,预计需要花费 12 分钟才能阅读完成。

[TOC]

Golang+chromedp+goquery 简略爬取动态数据

兵长:

胖 sir,最近一段时间正在应用 golang 来进行开发我的项目,缓缓的对 golang 有了一些理解,忽然有一天,我想用 golang 来实现爬取网站上的数据,例如 天气预报 每日一句 等等,发现这些网站的数据都是 javascript 动静生成,苦恼呀,不晓得如何能力把网站上的 动态数据 获取下来,为我所用呀,例如我抓取到动态数据之后发邮件给我哟

胖 sir 撩撩了本人的长发,温和的对兵长说,小伙子,golang做利用开发效率很快的,当然爬取网站上的数据也是不在话下的哟,动静的也有动静的办法,来我给你娓娓道来

Golang 的装置

此步骤次要是为了关照没有在 linux 上装置过 golang 的童鞋们,若本人做过装置过 golang 的童鞋能够间接跳过 golang 简略装置步骤

下载 golang 软件

  • 【国内网站】https://studygolang.com/dl go 语言中文网下载 go 最新的安装包,依据不同的零碎,能够抉择 windows,linux,mac
  • 【能够上外网的话】拜访 go 语言英文网站 https://docs.studygolang.com/doc/install

解压 golang

tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz

配置 golang

  • 将 go 的二进制目录增加到 PATH 环境变量

    vim /etc/profile
    export GOROOT=/usr/local/go
    export PATH=$PATH:$GOROOT/bin

从新导入配置

source /etc/profile

chromedp 框架的应用

chromedp 框架 github开源的,童鞋们能够释怀食用,若是有想法,能够在 github 上为此添砖加瓦,为开源做出本人的一份奉献

能够通过如下命令来进行下载

github.com/chromedp/chromedp

理论的代码编写

兵长,你想爬取 每日一句 的网站,我给你找一个例子,如爬取这个网站http://news.iciba.com/,咱们将网站上每天都会更新的一句话爬取出来

开始编码

// 获取网站上爬取的数据
func GetHttpHtmlContent(url string, selector string, sel interface{}) (string, error) {options := []chromedp.ExecAllocatorOption{chromedp.Flag("headless", true), // debug 应用
        chromedp.Flag("blink-settings", "imagesEnabled=false"),
        chromedp.UserAgent(`Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36`),
    }
    // 初始化参数,先传一个空的数据    
    options = append(chromedp.DefaultExecAllocatorOptions[:], options...)

    c, _ := chromedp.NewExecAllocator(context.Background(), options...)

    // create context
    chromeCtx, cancel := chromedp.NewContext(c, chromedp.WithLogf(log.Printf))
    // 执行一个空 task, 用提前创立 Chrome 实例
    chromedp.Run(chromeCtx, make([]chromedp.Action, 0, 1)...)

    // 创立一个上下文,超时工夫为 40s
    timeoutCtx, cancel := context.WithTimeout(chromeCtx, 40*time.Second)
    defer cancel()

    var htmlContent string
    err := chromedp.Run(timeoutCtx,
        chromedp.Navigate(url),
        chromedp.WaitVisible(selector),
        chromedp.OuterHTML(sel, &htmlContent, chromedp.ByJSPath),
    )
    if err != nil {logger.Info("Run err : %v\n", err)
        return "", err
    }
    //log.Println(htmlContent)

    return htmlContent, nil
}
  • GetHttpHtmlContent做为一个爬取网站动态数据的接口,次要性能是爬取 js 生成的动态数据(当然静态数据更是不在话下)
  • 第一个参数 url即为咱们须要传入的要爬取的网站地址,页面如上
  • 第二个参数 selector即为咱们爬取的数据对应的选 html 择器, 通过谷歌浏览器进入网站,按F12 -> 点击左上角的鼠标 -> 再点击咱们须要爬取的数据 -> 就能够看到理论的 html 源码 (目前看到的是通过javascript 动静生成数据后的)

    右键点击item-bottom -> Copy -> Copy selector 即可失去如下后果

    body > div.screen > div.banner > div.swiper-container-place > div > div.swiper-slide.swiper-slide-0.swiper-slide-visible.swiper-slide-active > a.item.item-big > div.item-bottom

    此字符串即为 GetHttpHtmlContent 函数的第二个参数selector

  • 第三个参数 咱们临时先写

    document.querySelector("body") // 从 body 外面获取数据
  • 返回值 即为 爬取到的数据,是字符串格局的,内容是 html

如下是拓展和解释上述代码的内容

  • chromedp.Flagchromedp设置参数,设置为 无头模式 headless ,无头模式即 Chrome 浏览器的无 GUI 的命令行版浏览器,但性能上和咱们平时应用的 chrome 没有区别,若该参数不设置为 true,则在程序运行的时候,chromedp 会拉取咱们环境中的 chrome 浏览器,显示页面
  • chromedp.Flag("blink-settings", "imagesEnabled=false")设置为不显示图片
  • htmlContent用于接管爬取的后果,是一个字符串格局,具体内容是html
  • chromedp.ByJSPath 是只以什么形式进行解析,这是一个回调函数,这个参数还能够填上面几个,按需索取

    • chromedp.ByNodeID
    • chromedp.BySearch
    • chromedp.ByID
    • chromedp.ByQueryAll
    • chromedp.ByQuery
    • chromedp.ByFunc
  • 对于 chromedp 波及的接口如下给 兵长 介绍几个

    名字 阐明
    Navigate 进入某个页面
    Run 运行各类操作
    Screenshot 截屏
    Click 模仿鼠标点击
    WaitVisible 等待某元素呈现
    ActionFunc 执行自定义函数
    SendKeys 模仿键盘输入

兵长:应用这个框架我失去的是一串 html 的字符串,我也不会解析他呀,我要如何能力找到方才在页面上看到的 每日一句

胖 sir:别放心,我一步一步给你说,直播教学呢,看好了,当初咱们曾经实现了最外围的一步了,当初数据曾经获取到了,咯,我给你介绍一个神奇,goquery就能够解决上面这一串 html 的解析问题了

goquery 第三方库的应用

我之前写过一个小接口,能够给你看看,兵长

goquery也是 github 开源的,童鞋们能够释怀食用哦,通过如下命令在下载 goquery 第三方库

go get github.com/PuerkitoBio/goquery

开始编码

// 失去具体的数据
func GetSpecialData(htmlContent string, selector string) (string, error) {dom, err := goquery.NewDocumentFromReader(strings.NewReader(htmlContent))
    if err != nil {logger.Error(err)
        return "", err
    }

    var str string
    dom.Find(selector).Each(func(i int, selection *goquery.Selection) {str = selection.Text()
    })
    return str, nil
}
  • 第一个参数 htmlContent 就是 下面 chromedp爬取到的数据,是字符串,内容是html
  • 第二个参数即是 html 的选择器,对于这个网站,这个参数能够填 .chinese ,如

    GetSpecialData(htmlContent, ".chinese")
  • 返回值就是咱们要抓取的后果了 当你是在为梦想成真致力时,就不会有压力。

如下是对于 goquery 一些用法

次要是对于 html 各种选择器的写法应用形式,上面简略介绍一下品种,如果须要具体理解,能够给我留言哟

  • 基于 HTML Element 元素的选择器
  • ID 选择器
  • Class 选择器
  • 属性选择器
  • parent > child 选择器
  • element + next 相邻选择器
  • element~next 兄弟选择器

胖 sir:兵长,我说的这些还算清楚吧,你晓得怎么用了吗?

兵长:明~ 明确了,我还要多加练习,多多爬取一下不同的站数据看看成果

胖 sir:诶,兵长方才你说你想将数据处理结束后,发邮件给你本人吗?

兵长:对呀,诶呀,这又是个问题。我不晓得把程序放在那里呢,放在我本人电脑外面的话,我电脑每天是要关机的,我劳动了,我的电脑也要跟着我劳动,诶,咋办呀

胖 sir:好办,这个我能够举荐你用一下 阿里云服务器

如何将本人的程序部署到阿里云服务器上

本人买一个云服务器就能够很不便的将本人的监控程序或者须要始终运行的程序放在下面,这就能够 7 *24 小时不间断的跑了,我最近感触了一下,的确好用。具体的阿里云购买形式能够尝试扫描上面的二维码或者点击链接进行购买,亲测真的好用,如何应用和简略配置,能够给我留言获取材料。

当然,须要上述整个小案例源码的,也能够给我留言哦,让咱们一起实际咱们的每一个想法,一步一步往上爬。

胖 sir:兵长,我须要揭示一点哦,阿里云服务器会主动把你的运行程序敞开掉了的

兵长:啊?那么你还让我买服务器,你这不是坑我吗

胖 sir:别急,我举荐的必定是好货色啦,还附带解决方案哟

screen 工具

screen 工具能够帮忙咱们将可执行程序部署到阿里云服务器下面,且可能始终不间断的运行

原理:

screen 是在服务器上独自开一个过程,让他专门来执行后台任务。

具体操作:

  • 装置

    //ubuntu 装置
    sudo apt-get install screen
    //centos
    yum install screen
  • 创立 screen 窗口

    screen -S  name
    例如:screen -S  ssh
  • 查看过程

    screen -ls

  • 进入本人的 manager

    screen -r -d 本人的 id
    如:screen -r -d 5295
  • 敞开 screen 过程

    screen -S 过程名 -X quit

大家如果有须要,能够通过此链接购买阿里云服务器,目前萌新有优惠,亲测很可,别问我是谁,我是活雷锋。

https://www.aliyun.com/activity?taskCode=messenger2101&recordId=337686&usercode=&share_source=copy_link

作者:小魔童哪吒

正文完
 0