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

作者:小魔童哪吒

Golang+chromedp+goquery 简单爬取动态数据的更多相关文章

  1. 爬虫系列4:Requests+Xpath 爬取动态数据

    爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...

  2. Ajax爬取动态数据和HTTPS自动默认证书

    Ajax数据爬取 在spider爬取数据的过程中,有些网页的数据是利用Ajax动态加载出来的,所以,在网页源代码中可能不会看到这一部分的数据,因此,我们需要使用另外的方式进行数据多爬取. 以豆瓣电影的 ...

  3. python 爬取动态数据

    按照:https://dryscrape.readthedocs.io/en/latest/installation.html 安装dryscrape 以下是简单实现 import dryscrape ...

  4. Python 爬虫实例(8)—— 爬取 动态页面

    今天使用python 和selenium爬取动态数据,主要是通过不停的更新页面,实现数据的爬取,要爬取的数据如下图 源代码: #-*-coding:utf-8-*- import time from ...

  5. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  6. Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  7. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  8. 一个月入门Python爬虫,轻松爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  9. phantomjs+selenium实现爬取动态网址

    之前使用 selenium + firefox驱动浏览器来实现爬取动态网址,但是firefox经常更新,更新后时常会导致webdriver启动不来,所以改用phantomjs+selenium来改善一 ...

随机推荐

  1. Codeforces Round #579 (Div. 3) E. Boxers (贪心)

    题意:给你一组数,每个数都可以进行一次加一减一,问最后最多能有多少不同的数. 题解:我们可以用桶存每个数的次数,然后枚举\([1,150001]\)来求对答案的贡献,然后贪心,这里我们不用担心其他乱七 ...

  2. Gym 100803G Flipping Parentheses

    题目链接:http://codeforces.com/gym/100803/attachments/download/3816/20142015-acmicpc-asia-tokyo-regional ...

  3. 郁闷的出纳员 HYSBZ - 1503

    OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他 ...

  4. kafka——集群安裝部署(自带zookeeper)

    kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 一.kafka简介 kafka官网:http://kafka.apache.or ...

  5. 国产网络测试仪MiniSMB - 如何配置VLAN数据流

    国产网络测试仪MiniSMB(www.minismb.com)是复刻smartbits的IP网络性能测试工具,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太 ...

  6. Leetcode(25)- k个一组翻转链表

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这个链表: ...

  7. 阿里巴巴java开发手册(2020版)

    阿里巴巴java开发手册(2020版) 2020版 链接: pan.baidu.com/s/1Zls_FUBK- 密码: titz 2019版 链接: pan.baidu.com/s/1cvCVQvj ...

  8. git 取消未成功的 merge

    git 取消未成功的 merge # 合并时遇到冲突想取消操作,恢复index $ git merge --abort # 可以回退到某个提交 $ git reset --hard # 可以撤销某个提 ...

  9. OOP & 模块化, 多态, 封装

    OOP 面向对象编程 (OOP) 是用抽象方式创建基于现实世界模型的一种编程模式.它使用先前建立的范例,包括模块化,多态和封装几种技术. 在 OOP 中,每个对象能够接收消息,处理数据和发送消息给其他 ...

  10. PWA & Service Workers 版本更新 bug

    PWA & Service Workers 版本更新 bug PWA & Service Worker https://developer.mozilla.org/zh-CN/docs ...