Golang+chromedp+goquery 简单爬取动态数据 |Go主题月

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
云服务器(按量付费),48vCPU 186GiB
简介: 胖sir,最近一段时间正在使用golang来进行开发项目,慢慢的对golang有了一些了解,突然有一天,我想用golang来实现爬取网站上的数据,例如天气预报,每日一句等等,发现这些网站的数据都是javascript动态生成,苦恼呀,不知道如何才能把网站上的动态数据获取下来,为我所用呀,例如我抓取到动态数据之后发邮件给我哟

兵长:

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

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

Golang的安装

此步骤主要是为了照顾没有在linux上安装过golang的童鞋们,若自己做过安装过golang的童鞋可以直接跳过golang简单安装步骤

下载golang软件

解压golang

bash


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

配置golang

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

vim /etc/profileexport GOROOT=/usr/local/goexport PATH=PATH:PATH:GOROOT/bin

重新导入配置

bash


source /etc/profile

chromedp框架的使用

chromedp框架是github开源的,童鞋们可以放心食用,若是有想法,可以在github上为此添砖加瓦,为开源做出自己的一份贡献

可以通过如下命令来进行下载

bash


github.com/chromedp/chromedp

实际的代码编写

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

image.png

image-20210303224355228

开始编码


//获取网站上爬取的数据
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)...)
        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动态生成数据后的)
    image.png
    image-20210303230303671
    右键点击item-bottom -> Copy-> Copy selector 即可得到如下结果
    image.png
    image-20210303230803415

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
  • 第三个参数 我们暂时先写
  • dart

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

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

  • chromedp.Flag 给 chromedp设置参数,设置为 无头模式 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涉及的接口如下给兵长介绍几个

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

胖sir:别担心,我一步一步给你说,直播教学呢,看好了, 现在我们已经完成了最核心的一步了,现在数据已经获取到了,咯,我给你介绍一个神奇,goquery就可以解决下面这一串html的解析问题了

image.png

image-20210303232139506

goquery第三方库的使用

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

goquery也是github开源的,童鞋们可以放心食用哦,通过如下命令在下载goquery第三方库

arduino

复制代码

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,如
  • scss
  • 复制代码
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是在服务器上单独开一个进程,让他专门来执行后台任务。

具体操作:

  • 安装
  • bash

//ubuntu安装sudo apt-get install screen//centosyum install screen
  • 创建screen窗口
screen -S  name例如:screen -S  ssh
  • 查看进程
  • bash

screen -ls
  • image.png
  • image-20210303234906943
  • 进入自己的manager
  • bash

screen -r -d 自己的id如:screen -r -d 5295
  • 关闭screen进程

screen -S 进程名 -X quit

大家如果有需要,可以通过此链接购买阿里云服务器,目前萌新有优惠,亲测很可,别问我是谁,我是小魔童哪吒。

ini

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

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
71 0
|
17天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
56 6
Go语言学习12-数据的使用
|
17天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
33 1
Go语言学习11-数据初始化
|
17天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
144 1
|
17天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
61 1
|
17天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
65 1
|
17天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
32 1
|
17天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
40 0
|
17天前
|
Prometheus 监控 Cloud Native
Golang深入浅出之-Go语言中的分布式追踪与监控系统集成
【5月更文挑战第4天】本文探讨了Go语言中分布式追踪与监控的重要性,包括追踪的三个核心组件和监控系统集成。常见问题有追踪数据丢失、性能开销和监控指标不当。解决策略涉及使用OpenTracing或OpenTelemetry协议、采样策略以及聚焦关键指标。文中提供了OpenTelemetry和Prometheus的Go代码示例,强调全面可观测性对微服务架构的意义,并提示选择合适工具和策略以确保系统稳定高效。
149 5
|
17天前
|
负载均衡 算法 Go
Golang深入浅出之-Go语言中的服务注册与发现机制
【5月更文挑战第4天】本文探讨了Go语言中服务注册与发现的关键原理和实践,包括服务注册、心跳机制、一致性问题和负载均衡策略。示例代码演示了使用Consul进行服务注册和客户端发现服务的实现。在实际应用中,需要解决心跳失效、注册信息一致性和服务负载均衡等问题,以确保微服务架构的稳定性和效率。
25 3
http://www.vxiaotou.com