chromedp仿真爬虫
介绍
golang仿真爬虫包
功能
完全模拟人工操作
支持Chrome DevTools Protocol
用途
自动化测试、爬虫、自动签到等等人工能完成的所有操作
反爬策略绕过方式
常见的验证方式:
- 扫码登陆
- 短信验证
- 图形验证
- 点击验证
- 其他
绕过思路:
人工完成验证
缺点
比较吃资源,因为chrome本身比较吃内存。
使用入门
浏览器初始化默认参数
1 | var DefaultExecAllocatorOptions = [...]ExecAllocatorOption{ |
用前须知
chromedp使用context参数传递上下文,用以区分不同浏览器,同时将操作串联成线。
chromedp需要初始化,主要指定浏览器运行时的一些参数,以及何时回收资源(关闭浏览器)。
chromedp使用run方法,传递符合chromedp.Action接口的动作,以调用这些动作。
常用功能:
1 | chromedp.NewContext() 初始化chromedp的上下文,后续这个页面都使用这个上下文进行操作 |
参考:
https://github.com/chromedp/chromedp
https://www.baidu.com/s?ie=UTF-8&wd=chromedp
简单调试
分解动作,动作之间穿插输出,判断程序运行状况。
使用步骤
开启gomod支持
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
示例:访问百度,并搜索
1 | package main |
注意点
注意点一
可以使用chromedp.Flag("headless", false)
参数显示浏览器,默认是隐藏的,然而从实践中得知,初始化时只要指定headless参数,
不管是chromedp.Flag("headless", false)
还是chromedp.Flag("headless", true)
,chrome都会显示,除非不指定headless
参数,浏览器才会隐藏。
从github的issue页面中得知,当启用headless隐藏浏览器时,此时user-agent会发生变化(添加了headless标识),应该在初始化时手动指定user-agent。
从github的issue页面中得知,如果想对google的一些资产进行自动化测试,应该指定enable-automation
参数为false
,关闭自动化测试标识符,此时浏览器将不再显示”Chrome正受到自动化测试软件的控制。”字样,如下图:
注意点二
chromedp无法处理Alert的弹窗内容,如果页面出现Alert,将会导致页面永久加载下去,chromedp将无法进行其他动作,解决这个问题有两个方法:
方法一:
手动关闭弹窗,chromedp将会恢复
方法二:
使用chromedp操控js控制台,屏蔽弹窗,代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 func main() {
// create context
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// run task list
var res interface{}
err := chromedp.Run(ctx,
chromedp.Navigate(`https://www.quackit.com/javascript/javascript_alert_box.cfm`), // navigate to random page
chromedp.EvaluateAsDevTools(`window.alert = function (txt){return txt}`, &res), // set a function to return the text in the alert box as text
chromedp.EvaluateAsDevTools(`alert('hehe')`, &res), // create an alert box to test the execution
)
if err != nil {
log.Fatal(err)
}
log.Println(res)参考文章:
https://stackoverflow.com/questions/58085607/chromedp-handle-alert