示例说明:用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. 2019.08.02 云从科技C++后台开发

    公司坐标:重庆 岗位:C++后台开发 面试时长:45分钟 主要问题记录: (1)手写代码 冒泡算法的实现: /**   * 冒泡排序:C++   *   * @author skywang   * @ ...

  2. # win10下设置软件启动快捷方式

    win10下设置软件启动快捷方式 win10下设置软件启动快捷键,必须把快捷方式放在C:\ProgramData\Microsoft\Windows\Start Menu\Programs目录下,在这 ...

  3. Python可修改和不可修改类型变量(mutuable and immutuable)

    通俗的讲,可修改可以理解为可以在数据所在内存地址直接修改,而不可修改则意味着一旦修改便是创建新的数据对象,而不是在原来的对象内存地址修改 1,Mutuable object [sourcecode l ...

  4. 第5章:Linux系统管理

    1.文件读写 1).Python内置的open函数 f = open('data.txt', 'w') f.write('hello, world') f.close() 2).避免文件句柄泄露 tr ...

  5. k8s之RBAC-基于角色的访问控制

    一个在名称空间内的对象的完整url模板: Object_URL: /apis/<GROUP>/<VERSION>/namespaces/<NAMESPACE_NAME&g ...

  6. spring——自动装配

    语法:<bean id="..." class="..." autowire="byType"/> autowire属性取值如下 ...

  7. 沿路径动画(Animation Along a Path)

    Silverlight 提供一个好的动画基础,但缺少一种方便的方法沿任意几何路径对象进行动画处理.在Windows Presentation Foundation中提供了动画处理类DoubleAnim ...

  8. 买条Vineyard Vines裙子为啥子那么难?因为能遮胖?因为英国王子穿过?

    为了这件vineyard vines, 我周六冒雨,去斯坦福shopping center说卖完了,我冒雨赶回家,上网买到了,今天早上发email说没货了,自动取消我的订单.我下午又打了40分钟电话给 ...

  9. 微信小程序点击图片预览-wx.previewImage

    <view class='imgList'> <view class='imgList-li' wx:for='{{imgArr}}'> <image class='im ...

  10. win 10 睡眠无法唤醒

    近日遇到win10系统睡眠后无法唤醒的问题,于是网上到处搜索解决办法,试了其中几个比如回退 Intel(R) Management Engine Interface 的版本.设置电源的睡眠选项以利用休 ...