Browse Source

新增浏览器接口

Signed-off-by: allan716 <[email protected]>
allan716 3 years ago
parent
commit
c695655410
2 changed files with 35 additions and 11 deletions
  1. 34 10
      pkg/rod_helper/multi_browser.go
  2. 1 1
      pkg/rod_helper/multi_browser_test.go

+ 34 - 10
pkg/rod_helper/multi_browser.go

@@ -15,15 +15,17 @@ import (
 )
 
 type Browser struct {
-	log            *logrus.Logger
-	rodOptions     *BrowserOptions // 参数
-	multiBrowser   []*rod.Browser  // 多浏览器实例
-	browserIndex   int             // 当前使用的浏览器的索引
-	browserLocker  sync.Mutex      // 浏览器的锁
-	LbHttpUrl      string          // 负载均衡的 http proxy url
-	LBPort         int             //负载均衡 http 端口
-	httpProxyUrls  []string        // XrayPool 中的代理信息
-	socksProxyUrls []string        // XrayPool 中的代理信息
+	log             *logrus.Logger
+	rodOptions      *BrowserOptions // 参数
+	multiBrowser    []*rod.Browser  // 多浏览器实例
+	browserIndex    int             // 当前使用的浏览器的索引
+	browserLocker   sync.Mutex      // 浏览器的锁
+	httpProxyIndex  int             // 当前使用的 http 代理的索引
+	httpProxyLocker sync.Mutex      // http 代理的锁
+	LbHttpUrl       string          // 负载均衡的 http proxy url
+	LBPort          int             //负载均衡 http 端口
+	httpProxyUrls   []string        // XrayPool 中的代理信息
+	socksProxyUrls  []string        // XrayPool 中的代理信息
 }
 
 // NewMultiBrowser 面向与爬虫的时候使用 Browser
@@ -89,7 +91,8 @@ func NewMultiBrowser(browserOptions *BrowserOptions) *Browser {
 	return b
 }
 
-func (b *Browser) GetOneBrowser() *rod.Browser {
+// GetLBBrowser 这里获取到的 Browser 使用的代理是负载均衡的代理
+func (b *Browser) GetLBBrowser() *rod.Browser {
 
 	b.browserLocker.Lock()
 	defer func() {
@@ -104,6 +107,27 @@ func (b *Browser) GetOneBrowser() *rod.Browser {
 	return b.multiBrowser[b.browserIndex]
 }
 
+// NewBrowser 每次新建一个 Browser ,使用 HttpProxy 列表中的一个作为代理
+func (b *Browser) NewBrowser() (*rod.Browser, error) {
+
+	b.httpProxyLocker.Lock()
+	defer func() {
+		b.httpProxyIndex++
+		b.httpProxyLocker.Unlock()
+	}()
+
+	if b.httpProxyIndex >= len(b.httpProxyUrls) {
+		b.httpProxyIndex = 0
+	}
+
+	oneBrowser, err := NewBrowserBase(b.log, "", b.httpProxyUrls[b.httpProxyIndex], b.rodOptions.LoadAdblock)
+	if err != nil {
+		return nil, errors.New("NewBrowser.NewBrowserBase error:" + err.Error())
+	}
+
+	return oneBrowser, nil
+}
+
 func (b *Browser) Close() {
 
 	for _, oneBrowser := range b.multiBrowser {

+ 1 - 1
pkg/rod_helper/multi_browser_test.go

@@ -16,7 +16,7 @@ func TestNewMultiBrowser(t *testing.T) {
 	b := NewMultiBrowser(browserOptions)
 
 	for i := 0; i < 5; i++ {
-		page, _, _, err := NewPageNavigateWithProxy(b.GetOneBrowser(), b.LbHttpUrl, "https://www.ipaddress.my/", 10*time.Second)
+		page, _, _, err := NewPageNavigateWithProxy(b.GetLBBrowser(), b.LbHttpUrl, "https://www.ipaddress.my/", 10*time.Second)
 		if err != nil {
 			return
 		}