[TOC]

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

兵长:

golang天气预报每日一句javascript动态数据
golang

Golang的装置

linux

下载golang软件

https://studygolang.com/dl windows,linux,mac https://docs.studygolang.com/doc/install

解压golang

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

配置golang

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

从新导入配置

source /etc/profile

chromedp框架的应用

chromedp框架githubgithub

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

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
}
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
document.querySelector("body") //从body外面获取数据

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

chromedp.Flagchromedp无头模式 headless truechromedpchromedp.Flag("blink-settings", "imagesEnabled=false")htmlContenthtmlchromedp.ByJSPathchromedp.ByNodeIDchromedp.BySearchchromedp.ByIDchromedp.ByQueryAllchromedp.ByQuerychromedp.ByFuncchromedp兵长
html每日一句
goqueryhtml

goquery第三方库的应用

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

goquerygithub
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
}
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 -S  name
例如:
screen -S  ssh
screen -ls
screen -r -d 本人的id
如:
screen -r -d 5295
screen -S 过程名 -X quit

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

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