【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)

            }

        }

    })

小结

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

以上。

相关推荐
用户785127814701 小时前
Python代码获取京东商品详情原数据 API 接口(item_get_app)
后端
JAVA数据结构1 小时前
BPMN-Activiti-简单流程委托
后端
sivdead1 小时前
智能体记忆机制详解
人工智能·后端·agent
拉不动的猪1 小时前
图文引用打包时的常见情景解析
前端·javascript·后端
该用户已不存在1 小时前
程序员的噩梦,祖传代码该怎么下手?
前端·后端
间彧2 小时前
Redis缓存穿透、缓存雪崩、缓存击穿详解与代码实现
后端
摸鱼的春哥2 小时前
【编程】是什么编程思想,让老板对小伙怒飙英文?Are you OK?
前端·javascript·后端
Max8122 小时前
Agno Agent 服务端文件上传处理机制
后端
调试人生的显微镜2 小时前
苹果 App 怎么上架?从开发到发布的完整流程与使用 开心上架 跨平台上传
后端
顾漂亮3 小时前
Spring AOP 实战案例+避坑指南
java·后端·spring