Go大道至简之抓取网页

news2024/11/18 12:15:41

目录

  • 前期准备
    • 环境
  • 教程
    • 浏览器启动
      • 命令启动
      • Rod启动浏览器
      • Rod自动查找浏览器路径并启动
    • 输入和点击、Enter动作
    • 多页面抓取

前期准备

环境

  • Go版本大于等于1.18
  • Go模块源更换,加速模块下载
    go env -w GO111MODULE=on
    go env -w GOPROXY=https://goproxy.cn,direct
    
  • Rod模块
  • Rod 是一个直接基于 DevTools Protocol 高级驱动程序。 它是为网页自动化和爬虫而设计的,既可用于高级应用开发也可用于低级应用开发,高级开发人员可以使用低级包和函数来轻松地定制或建立他们自己的Rod版本,高级函数只是建立Rod默认版本的例子。

    go get github.com/go-rod/rod
    
  • 浏览器:Edge、Chrome

教程

浏览器启动

命令启动

查找浏览器的可执行路径

#例如 macOS 运行:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --remote-debugging-port=9222
# 它将输出类似于:
`DevTools listening on ws://127.0.0.1:9222/devtools/browser/4dcf09f2-ba2b-463a-8ff5-90d27c6cc913`

ws://127.0.0.1:9222/devtools/browser/xxxx 就是控制浏览器的接口

func main() {
    u := "ws://127.0.0.1:9222/devtools/browser/4dcf09f2-ba2b-463a-8ff5-90d27c6cc913"
    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

Rod启动浏览器

launcher 库来简化浏览器的启动。 例如自动下载或搜索浏览器可执行程序, 添加或删除浏览器可执行程序的命令行参数等。

func main() {
    u := launcher.New().Bin("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome").MustLaunch()
    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

Rod自动查找浏览器路径并启动

可以使用帮助函数 launcher.LookPath 来获取浏览器的可执行文件路径

func main() {
    path, _ := launcher.LookPath()
    u := launcher.New().Bin(path).MustLaunch()
    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

输入和点击、Enter动作

网站可能有许多输入框和按钮,我们需要告诉程序它需要操控其中的哪一个。

#被访问网址
baidu := "https://www.baidu.com"
#启动浏览器
launch := launcher.NewUserMode().Devtools(true).Bin("/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge").MustLaunch()
#访问网站
page := rod.New().ControlURL(launch).NoDefaultDevice().MustConnect().MustPage(baidu)
#模拟用户点击
#proto.InputMouseButtonLeft 表示模拟鼠标左键点击
page.Timeout(3*time.Second).MustElement("#kw").MustInput("chatGPT").MustElement("#submit").Click(proto.InputMouseButtonLeft, 1) # 1表示点击数量
#模拟用户搜索
#input.Ente 表示模拟回车键
page.Timeout(3*time.Second).MustElement("#kw").MustInput("chatGPT").Type(input.Ente)
#截图搜索结果
page.MustWaitLoad().MustScreenshot("chatGPT.png")

启动脚本

#重点:-rod=show,直观的看到效果
go run main.go -rod=show
# 慢动作和可视化跟踪
go run . -rod="show,slow=1s,trace"

效果图
搜索截图

多页面抓取

抓取过程中经常会出现,点击链接打开新窗口,这时是无法正常拿到新窗口页面数据,还会造成脚本无法退出。解决办法就是,多页面抓取,把打开新窗口的链接,用mustPage方法打开新的界面,完成数据抓取。

	baidu := "https://www.baidu.com"
	path, b := launcher.LookPath()
	if !b {
		log.Fatalln("启动失败")
	}
	launch := launcher.New().Bin(path).MustLaunch()
	page := rod.New().ControlURL(launch).MustConnect()
	// A页面,打开百度搜索
	A := page.MustPage(baidu)
	A.Timeout(3 * time.Second).MustElement("#kw").MustInput("chatGPT").Type(input.Enter)
	// 获取百度百科链接
	href := A.MustElement("#\\32  > div > div > h3 > a").MustAttribute("href")
	// B页面,打开百度百科链接
	B := page.MustPage(*href)
	//页面元素数据
	link := B.MustElement("body > div.body-wrapper > div.content-wrapper > div > div.side-content > div.summary-pic > a > img").MustAttribute("src")
	text := B.MustElement("body > div.body-wrapper > div.content-wrapper > div > div.main-content.J-content > div:nth-child(13)").MustText()
	//打印
	fmt.Println(*href,*link, text)

效果图
效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4年经验来面试20K的测试岗,连基础都不会,还不如招应届生。

公司前段时间缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。 看简历很多都是3、4年工作经验&#xf…

chatGPT做了这么一道数学题,我陷入了沉思

已知 2cos23cosasina−3sin2a1,并且a∈(−32π,−π)2cos^{2}3cosasina-3sin^{2}a1 ,并且a\in(-\frac{3}{2}\pi,-\pi) 2cos23cosasina−3sin2a1,并且a∈(−23​π,−π) 求 2sin(π−a)−3sin(π2a))4sina−9cosa\frac{2sin(\pi-a)-3sin(\frac{\pi}{2}a))}{4sina-9cosa} 4sina−…

Sage X3 ERP的称重插件帮助食品和化工企业实现精细化管理

目录 需要称重插件管理的行业客户 Sage X3 ERP称重插件管理的两个关键单位 Sage X3 ERP称重插件的特色 Sage X3 ERP称重插件管理的重要性 需要称重插件管理的行业客户 术语“实际重量”表示在销售和运输时捕获的物品重量。生产销售家禽、肥料、钢材或任何其他需要跟踪实…

【Spark分布式内存计算框架——Spark SQL】4. DataFrame(上)

3.1 DataFrame是什么 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于,前者带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。 使…

chatGPT 配合excel /maxscript使用_初试

EXCEL 配合chatGPT方法一:利用excel的開發工具1打開excel的VB编辑器:如果頂部菜單上沒有看到開發工具,需要先按下面步驟打開開發工具:這樣按上面步驟就可以打開excel的開發工具~ 然後點擊VB~ 2让chatGPT帮忙写脚本在chatGPT上提问…

Tomcat是如何隔离Web应用的

Tomcat通过自定义的类加载器WebAppClassLoader打破了双亲委托机制,目的就是为了优化加载Web应用目录下的类。Tomcat 作为 Servlet 容器,它负责加载我们Servlet 类,此外它还负责加载 Servlet 所依赖的 JAR 包。并且Tomcat 本身也是也是一个 Ja…

petalinux 2020.2 离线编译

链接:[https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html] 2、在ubuntu下安装必要运行库。 1、sudo apt-get install iproute2 gawk python3 python 2、sudo apt-get install build-essential gcc gi…

第七届蓝桥杯省赛——8冰雹数(递归)

题目:任意给定一个正整数N,如果是偶数,执行: N / 2如果是奇数,执行: N * 3 1生成的新的数字再执行同样的动作,循环往复。通过观察发现,这个数字会一会儿上升到很高,一会…

海外问卷调查怎么做?手把手教会你如何薅老外的羊毛

问卷调查相信大家都不陌生。许多组织在推出新项目或新产品之前,会对全社会进行问卷调查,调查消费者或受众对产品的期望和价格的接受范围。东哥今天给大家介绍的就是海外问卷调查项目,外国人的羊毛,带你们薅定了!参与海…

基于ArgoCD实现k8s环境下的持续部署

什么是 argo CD Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 这里我们引入了一个新的概念, 什么是GitOps GitOps是以Git为基础,使用CI/CD来更新运行在云原生环境…

电脑资料如何转移到新电脑?教你3种数据迁移技巧

当下,电脑越来越普及,更换频率也越来越高。当我们购买新电脑,需要将旧电脑上的文件资料迁移到新电脑上,方便使用,电脑资料如何转移到新电脑?其实我们完全可以自己解决哦,下面一起来看下电脑资料…

VMware 修复了三个身份认证绕过漏洞

Bleeping Computer 网站披露,VMware 近期发布了安全更新,以解决 Workspace ONE Assist 解决方案中的三个严重漏洞,分别追踪为 CVE-2022-31685(认证绕过)、CVE-2022-31686 (认证方法失败)和 CVE-…

python应用之小麦生育期气象因子计算——基于pandas库

背景 本次介绍一下python的pandas包操作Excel(或者CSV等),应用情景是计算不同站点小麦多年生育期内的气象因子的特征(积温、降雨、辐射等) 主要涉及以下知识点: 儒略日转换数据框值获取与字符串加法基于que…

.md文件转.pdf文件

一、安装VS code vscode是一个轻量级的、可扩展性十分强的开发编辑器。过程略,比较简单。 二、安装插件Markdown PDF 直接 install 就可以了。 我这里出现了安装失败的情景,这时候可以通过它给的提示,安转markdown-pdf 的 .vsix 文件&#…

数据分析与SAS学习笔记2

SAS在企业使用的情况: SAS是一个很昂贵的商业软件。在企业中使用SAS比较多,在企业界中是比较流行,在学术界使用R比较多。 SAS简介:统计分析系统 处理生物分析数据。 SAS成为统计领域的国际标准软件,服务全球50000多家…

顶象业务安全大讲堂全新升级,挖洞大神喊你来get 挖洞秘籍啦!

CSDN直播间: 红队外网打点与情报收集策略——「业务安全大讲堂第二季第1期」https://live.csdn.net/room/dingxiangtech/rBN4xrOp 顶象业务安全大讲堂第二季将于2月23日重磅回归,本季业务安全大讲堂继续以业务安全为主题,为大家带来业务安全…

网络渗透之信息搜集

网络渗透之信息搜集一、信息搜集1.1 概念1.2 分类1.3 收集那些信息二、域名信息收集2.1 域名介绍2.2 域名分类2.3 域名信息查询- whois2.3.1 whois2.3.2 whois查询2.3.3 whois查询方法2.4 域名信息收集-备案信息三、子域名信息收集四、IP地址信息收集4.1 IP反查域名4.2 域名查询…

UVa 1343 The Rotation Game 旋转游戏 IDA* BFS 路径还原

题目链接:The Rotation Game 题目描述: 给定二十四个整数,这二十四个整数由八个一,八个二,八个三组成,从左到右,从上到下依次描述下图方格中的数字: 例如上图左边对应的输入就是[1,…

Java中List排序的3种方法!

引用:https://blog.csdn.net/sinat_32849897/article/details/122098256 在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的&#xff0c…

acwing 2 普通背包 2维做法的坑

背包问题应该都挺熟了,但还是放一下题目 无论是一维还是二维的解法,思路都比较一致,就是用一个二维的dpdpdp矩阵,dp[i][j]dp[i][j]dp[i][j] 的定义为前 iii 个元素的最优组合在容量为 jjj 的背包的最大价值。 这个定义非常的巧妙…