示例说明:用chromedp操作chrome,导航到baidu,然后输入“美女”,然后再翻2页,在此过程中保存cookie和所有img标签内容,并保存第一页的baidu logo为png

注释已经比较详细了,上代码:

package main

import (
"bufio"
"context"
"fmt" "io/ioutil"
"log"
"os" "github.com/chromedp/cdproto/page" "time" "github.com/chromedp/cdproto/network" "github.com/chromedp/cdproto/cdp" "github.com/chromedp/chromedp"
) var res string // 定义全局变量,用来保存爬虫的数据,注释掉了
var nodes []*cdp.Node // 定义全局变量,用来保存爬虫的数据node
var buf []byte //定义全局变量,用来保存Screenshot func main() {
var err error
// create context
ctxt, cancel := context.WithCancel(context.Background())
defer cancel() // create chrome instance
c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
if err != nil {
log.Fatal(err)
} // run task list
wd, _ := os.Getwd()
err = c.Run(ctxt, chromedp.Tasks{
page.SetDownloadBehavior(page.SetDownloadBehaviorBehaviorAllow).WithDownloadPath(wd),
chromedp.Navigate(`https://www.baidu.com/`), // 访问掉队的BAT
chromedp.WaitVisible(`#kw`, chromedp.ByQuery), // 等待id=kw渲染成功,成功则说明已经获取到了正确的页面
chromedp.SendKeys(`#kw`, `美女`, chromedp.ByID), //输入关键词
chromedp.Click("#su", chromedp.ByID), // 触发点击事件,
chromedp.Sleep( * time.Second), //缓一缓
//chromedp.OuterHTML("html", &res, chromedp.ByQuery), //获取html源码
chromedp.Nodes("img", &nodes, chromedp.ByQueryAll), //获取当前页的img标签
chromedp.Screenshot("#result_logo", &buf, chromedp.ByID),
// 获取cookie
chromedp.ActionFunc(func(ctx context.Context, h cdp.Executor) error {
cookies, err := network.GetAllCookies().Do(ctx, h)
// 将cookie拼接成header请求中cookie字段的模式
var coo string
for _, v := range cookies {
coo = coo + v.Name + "=" + v.Value + ";"
}
WirteTXT(coo) //保存cookie到文件
WirteTXT(fmt.Sprintf("\r\n\r\n%s", nodes)) //保存img标签
ioutil.WriteFile("contact-form.png", buf, )
if err != nil {
return err
}
return nil
}),
chromedp.ActionFunc(func(ctx context.Context, h cdp.Executor) error {
// 循环翻页
for i := ; i < ; i++ {
//执行
err = c.Run(ctxt, chromedp.Tasks{
chromedp.Click(`#page a:nth-last-child()`, chromedp.ByID), //翻页
chromedp.Sleep( * time.Second), //缓一缓
chromedp.Nodes("img", &nodes, chromedp.ByQueryAll), //获取标签的html }) //执行爬虫任务
WirteTXT(fmt.Sprintf("\r\n\r\n%s", nodes)) //保存img标签
}
return nil
}),
})
if err != nil {
log.Fatal(err)
} } func WirteTXT(txt string) {
f, err := os.OpenFile("1.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, )
if err != nil {
fmt.Println("os Create error: ", err)
return
}
defer f.Close() bw := bufio.NewWriter(f)
bw.WriteString(txt + "\n")
bw.Flush()
}

参考:

https://godoc.org/github.com/chromedp/chromedp#Selector.Do

https://www.jianshu.com/p/d282b4a57596

https://juejin.im/entry/5aac8374518825556a722de3

https://blog.csdn.net/yang731227/article/details/89202458

https://www.cnblogs.com/midnight/p/10384627.html

https://www.cnblogs.com/midnight/p/10384699.html

https://crieit.net/posts/chromedp-Node-HTML

https://qiita.com/yoheimuta/items/bbbe84d2a7fe673720b3

https://segmentfault.com/a/1190000019705499?utm_source=tag-newest

https://stackoverflow.com/search?q=chromedp

https://cloud.tencent.com/developer/ask/173850

https://www.ribice.ba/golang-chrome-automation/

https://gitee.com/-/ide/project/kwff/chromedp/edit/master/-/errors.go

https://www.cnblogs.com/apocelipes/archive/2018/07/04/9264673.html

如果在windows安装chromedp,还可参考我之前写的

https://www.cnblogs.com/pu369/p/10315988.html

https://www.cnblogs.com/pu369/p/10345483.html

之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例的更多相关文章

  1. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  2. 程序员为什么要写if else,为什么要和别人不一样

    程序员为什么要写if else,为什么要和别人不一样 前言 无聊,睡不着!本文只是随便写写而已!感叹一下程序员的生活! 刚看到一个八级程序员的分级,所以就写了这个随笔,分级如下:        第八级 ...

  3. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  4. 我写的Java相关的文章

    此文正在更新中... Activiti 升级到Activiti7了. Web service/Soap Java如何调用.net写的asmx服务

  5. 写给小白的 Nginx 文章

    原文地址:Nginx concepts I wish I knew years ago 原文作者:Aemie Jariwala(已授权) 译者 & 校正:HelloGitHub-小鱼干 &am ...

  6. 用Unity做的一个小游戏,仿照一个样例写的,个人认为文章写的不错,哈哈

  7. 我写的.net相关的文章

    此文正在更新中... 广州.net俱乐部相关 复活广州.net俱乐部 office365的开发者训练营,免费,在微软广州举办 被低估的.net(上) - 微软MonkeyFest 2018广州分享会活 ...

  8. 我写的Angular相关的文章

    此文正在更新中... Angular6的变化 Angular7的变化 No value accessor for form control with path的解决方案

  9. Nginx 相关介绍(Nginx是什么?能干嘛?个人觉得写得比较好的文章,转载过来)

    Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...

随机推荐

  1. HTTP用户认证、追加协议以及相关技术简单学习

    1. 用户身份认证 BASIC认证(基本认证): DIGEST(摘要认证): SSL客户端认证: FormBase认证(表单认证)常用: session和cookie 2. 基于HTTP的追加协议 A ...

  2. LeetCode. 矩阵中的最长递增路径

    题目要求: 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例: 输入: nums = [ ...

  3. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  4. Struts2的学习自我总结

    Struts2是一个轻量的的开源的框架,可以实现mvc的模式,起初struts和webwork两家公司都存在,后来strus的技术要落后一些,但是使用人群比较广泛,为了避免今后struts被淘汰,st ...

  5. Python文件操作——读写图片,音频,视频

    注意:其实就是将mode="rb"或者mode="wb",因为图片,视频,音频就是二进制进行读取,b  代表binary ,其他的和一般文件操作步骤一样,另外, ...

  6. python+django学习三

    在这个网站看https://sshwsfc.github.io/xadmin/     xadmin结果一堆的坑,文档找不到界面,dome登陆就报错permission denied for rela ...

  7. 如何给Swagger加注释

    在Startup.cs文件中的ConfigureServices()方法中添加如下代码即可 services.AddSwaggerGen(options => { options.Swagger ...

  8. PS笔记

    PS 笔记 PS调色人像步骤-by李涛: 色阶- 追饱和度- 色彩平衡-  中间调不动,阴影偏青,偏绿,偏蓝  , 高光偏红,偏一点蓝 锐化 1. 冷暖对比-by狼族摄影:   高光和阴影设置为偏青色 ...

  9. angularJs同步请求

    今天在写几级联动的时候,因为比如上一个接口请求数据成功返回后,才能根据上一个接口返回的数据请求下一个接口,以此类推:因此有了同步请求的想法. 在前端做同步读取显然不是好的实践做法,同步之后会严重影响前 ...

  10. 【Distributed】互联网安全架构

    一.常见Web安全漏洞 1.1 XSS攻击 什么是XSS攻击手段 如何防御XSS攻击 1.2 SQL注入攻击 什么是SQL注入 SQL注入防攻击手段 MyBatis #与$区别 1.3 Http请求防 ...