forked from Qianlitp/crawlergo
/
browser.go
executable file
·110 lines (92 loc) · 2.64 KB
/
browser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package engine
import (
"context"
"github.com/shadow1ng/crawlergo/pkg/logger"
"log"
"sync"
"time"
"github.com/chromedp/cdproto/browser"
"github.com/chromedp/chromedp"
)
type Browser struct {
Ctx *context.Context
Cancel *context.CancelFunc
tabs []*context.Context
tabCancels []context.CancelFunc
ExtraHeaders map[string]interface{}
lock sync.Mutex
}
func init() {
}
func InitBrowser(chromiumPath string, incognito bool, extraHeaders map[string]interface{}, proxy string, noHeadless bool) *Browser {
var bro Browser
opts := append(chromedp.DefaultExecAllocatorOptions[:],
// 执行路径
chromedp.ExecPath(chromiumPath),
// 无头模式
chromedp.Flag("headless", !noHeadless),
// 禁用GPU,不显示GUI
chromedp.Flag("disable-gpu", true),
// 隐身模式启动
chromedp.Flag("incognito", incognito),
// 取消沙盒模式
chromedp.Flag("no-sandbox", true),
// 忽略证书错误
chromedp.Flag("ignore-certificate-errors", true),
chromedp.Flag("disable-images", true),
//
chromedp.Flag("disable-web-security", true),
//
chromedp.Flag("disable-xss-auditor", true),
//
chromedp.Flag("disable-setuid-sandbox", true),
chromedp.Flag("allow-running-insecure-content", true),
chromedp.Flag("disable-webgl", true),
chromedp.Flag("disable-popup-blocking", true),
chromedp.WindowSize(1920, 1080),
)
// 设置浏览器代理
if proxy != "" {
opts = append(opts, chromedp.ProxyServer(proxy))
}
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
bctx, _ := chromedp.NewContext(allocCtx,
chromedp.WithLogf(log.Printf),
)
// https://github.com/chromedp/chromedp/issues/824#issuecomment-845664441
// 如果需要在一个浏览器上创建多个tab,则需要先创建浏览器的上下文,即运行下面的语句
chromedp.Run(bctx)
bro.Cancel = &cancel
bro.Ctx = &bctx
bro.ExtraHeaders = extraHeaders
return &bro
}
func (bro *Browser) NewTab(timeout time.Duration) (*context.Context, context.CancelFunc) {
bro.lock.Lock()
ctx, cancel := chromedp.NewContext(*bro.Ctx)
//defer cancel()
tCtx, _ := context.WithTimeout(ctx, timeout)
bro.tabs = append(bro.tabs, &tCtx)
bro.tabCancels = append(bro.tabCancels, cancel)
//defer cancel2()
bro.lock.Unlock()
//return bro.Ctx, &cancel
return &tCtx, cancel
}
func (bro *Browser) Close() {
//logger.Logger.Info("closing browser.")
for _, cancel := range bro.tabCancels {
cancel()
}
for _, ctx := range bro.tabs {
err := browser.Close().Do(*ctx)
if err != nil {
logger.Logger.Debug(err)
}
}
err := browser.Close().Do(*bro.Ctx)
if err != nil {
logger.Logger.Debug(err)
}
(*bro.Cancel)()
}