【chromedp】网页操作不该重复点点点

想法

工作中有个需求,需要对某个服务的配置文件进行替换。其中有个操作,需要对网页进行重复手动操作。那么作为程序员来说,重复的操作往往都能用脚本解决,而网页往往可以用爬虫来处理。刚好,我又会点爬虫。想到这就直接开写。

你将在本章中学到什么?

  • chromedp的基本使用

  • 爬虫经验

为什么使用chromedp

网页分为:"静态网页","动态网页",静态网页相等爬取比较简单,直接使用爬虫框架,或者http requests请求即可。比如:python的scrapy,golang的Colly。 但是往往很多网站都是js动态生成的,那么在这种情况下,需要通过浏览器模拟渲染动作,获取生成的页面源码,进而进行解析。

之前对于这种动态的页面爬取,使用的是scrapy+docker+splash来解决,很久没有写过python了,想用golang尝尝鲜。

chromedp如何理解:跟selenium, puppetter一样,都是通过调用chrome的底层协议来模拟浏览器来完成操作。

测试代码链接:github.com/toheart/gol...

简单使用

官方举例

go 复制代码
func TestSimple(t *testing.T) {

    // 创建一个chrome实例, 默认是headless的方式运行

    ctx, cancel := chromedp.NewContext(

        context.Background(),

    )

    defer cancel()

  


    ctx, cancel = context.WithTimeout(ctx, 15*time.Second)

    defer cancel()

  


    // navigate to a page, wait for an element, click

    var example string

    err := chromedp.Run(ctx,

        chromedp.Navigate(`https://pkg.go.dev/time`),

        // 等到body>footer的内容加载后,向下执行

        chromedp.WaitVisible(`body > footer`),

        // 进行点击操作

        chromedp.Click(`#example-After`, chromedp.NodeVisible),

        // 尝试获取#example-After的textarea中的值

        chromedp.Value(`#example-After textarea`, &example),

    )

    if err != nil {

        log.Fatal(err)

    }

    log.Printf("Go's time.After example:\n%s", example)

}

执行后,直接输出了textarea中内容。因为默认处于headless执行不可观测到实际的动作。所以接下来需要禁用headless。

代码如下:

go 复制代码
func TestWithoutHeadless(t *testing.T) {

    ctx, exCancel := chromedp.NewExecAllocator(

        context.Background(),

        // 以默认配置的数组为基础,覆写headless参数

        // 当然也可以根据自己的需要进行修改,这个flag是浏览器的设置

        append(

            chromedp.DefaultExecAllocatorOptions[:],

            chromedp.Flag("headless", false), // 显示界面

        )...,

    )

    defer exCancel()

   

    ....

}

执行完这个代码后,会显示调用出浏览器,对于排障比较舒服。

其他的一些操作示例,可以查看官方的example来执行:github.com/chromedp/ex...

爬虫经验

在爬虫过程中,我们需要定位dom来完成进一步操作,那么如何操作呢?

可以通过xpath, selector来进行定位。 具体操作如下:

打开浏览器-> F12->点击检查按钮->选择对应的元素->右键选择复制。

举证如下:

对于相同元素的获取,就需要提取相关特征,按Ctrl+F 键打开查找窗口来实现,如获取所有的目录名称如下:

xpath,selector语法可以直接查文档即可。

更多问题

  1. 如何理解chromedp这个实例?

答:chromedp就像等于你获得了一个chrome浏览器,可以通过这个实例将你的操作代码化。

  1. 作为一个爬虫任务,不可能只用一个tab页进行,这样会使得操作都串行了,效率降低,如何进行多开tab页,并行爬取?

答:这里触发一个支线任务,当对于一个新的第三方库,怎么办?这里可以看到chromedp的执行过程都是使用chromedp这个库开头调用里面的暴露出的function,那么这就好办了。直接打开pkg.go.dev/ 查询chromedp的api函数。全局搜索相关字段,比如new tab,即可定位相应函数。(当然需要第三方库写的比较好的情况下)

  1. 对于一些测试手段,我需要对网页中的某些http报文进行检查,校验,这部分如何操作?

答:在chromedp中,可以通过监听手段来获取浏览器相关的事件。代码如下:

go 复制代码
    chromedp.ListenTarget(ctx, func(ev interface{}) {

        switch ev := ev.(type) {

        case *network.EventResponseReceived:

            resp := ev.Response

            if len(resp.Headers) != 0 {

                // log.Printf("received headers: %s", resp.Headers)

                t.Logf("%s \n", resp.URL)

            }

        }

    })

小结

工作也是积累经验的一部分,程序员如果遇到重复性的工作,第一反应先慢下来,想想是否自己可以写一个程序来完成工作。

以上。

相关推荐
ZhengEnCi2 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go2 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD2 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
ZhengEnCi4 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj5204 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3275 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李5 小时前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒6 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish6 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端
苏三说技术7 小时前
为什么越来越多人用Arthas 4 ?
后端