之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例
示例说明:用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爬虫实例的更多相关文章
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
- 程序员为什么要写if else,为什么要和别人不一样
程序员为什么要写if else,为什么要和别人不一样 前言 无聊,睡不着!本文只是随便写写而已!感叹一下程序员的生活! 刚看到一个八级程序员的分级,所以就写了这个随笔,分级如下: 第八级 ...
- 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- 我写的Java相关的文章
此文正在更新中... Activiti 升级到Activiti7了. Web service/Soap Java如何调用.net写的asmx服务
- 写给小白的 Nginx 文章
原文地址:Nginx concepts I wish I knew years ago 原文作者:Aemie Jariwala(已授权) 译者 & 校正:HelloGitHub-小鱼干 &am ...
- 用Unity做的一个小游戏,仿照一个样例写的,个人认为文章写的不错,哈哈
- 我写的.net相关的文章
此文正在更新中... 广州.net俱乐部相关 复活广州.net俱乐部 office365的开发者训练营,免费,在微软广州举办 被低估的.net(上) - 微软MonkeyFest 2018广州分享会活 ...
- 我写的Angular相关的文章
此文正在更新中... Angular6的变化 Angular7的变化 No value accessor for form control with path的解决方案
- Nginx 相关介绍(Nginx是什么?能干嘛?个人觉得写得比较好的文章,转载过来)
Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...
随机推荐
- (六)mybatis 全局配置文件讲解
目录 properties (属性) settings 全局参数配置 typeAliases 别名设置 typeHandlers 类型处理器 mapper (映射器) 细节 properties (属 ...
- 学习扩展kmp
参考博客:https://blog.csdn.net/s_999999/article/details/89104957
- Django ORM相关的一些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- image的路径写法格式
if (MapGrid.Visibility == Visibility.Visible) { this.MapGrid.Visibility = Visibility.Collapsed; ...
- UVA10140PrimeDistance题解--质数/技巧
题目链接 https://www.luogu.org/problemnew/show/UVA10140 分析 \(L,R\)都很大,显然不能直接筛出\(L,R\)区间中的质数,这里需要一个结论 结论 ...
- LeetCode:178.分数排名
题目链接:https://leetcode-cn.com/problems/rank-scores/ 题目 编写一个 SQL 查询来实现分数排名.如果两个分数相同,则两个分数排名(Rank)相同.请注 ...
- asp.net 简单的身份验证
1 通常我们希望已经通过身份验证的才能够登录到网站的后台管理界面,对于asp.net 介绍一种简单的身份验证方式 首先在webconfig文件中添加如下的代码 <!--身份验证--> &l ...
- Java秒杀实战 (四)JMeter压测
转自:https://blog.csdn.net/qq_41305266/article/details/81071278. 一.JMeter入门 下载链接 http://jmeter.apache. ...
- 三台服务器的时间同步-Linux
192.168.1.30 做服务器时间 192.168.1.40 同步30 192.168.1.50 同步30 step1.在30机器上修改ntp.conf 添加: restrict 1 ...
- 【Git】五、远程仓库
前面4节将的都是本地的git操作,这节开始讲合并到本地分支后,如何与远程仓库做交互 -------------------------------- 提要 //生成本地ssh密钥 $ ssh-keyg ...