Go+selenium+chrome爬虫

准备工作:

安装chrome浏览器及chromedriver,注意两者版本要对应。chromedriver可以在这里下载

下面直接上代码:

package main

import (
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"github.com/tebeka/selenium"
	"github.com/tebeka/selenium/chrome"
	"log"
	"strings"
	"time"
)

// 定义一个爬虫结构体
type Crawler struct {
}

// 面向对象思想,将配置定义成方法
func (c Crawler) config() (opts []selenium.ServiceOption, caps selenium.Capabilities) {
	opts = []selenium.ServiceOption{}
	caps = selenium.Capabilities{
		"browserName": "chrome",
	}
	// 禁止加载图片,加快渲染速度
	imagCaps := map[string]interface{}{
		//"profile.managed_default_content_settings.images": 2,
	}
	chromeCaps := chrome.Capabilities{
		Prefs: imagCaps,
		Path:  "",
		Args: []string{
			//"--headless", // 设置Chrome无头模式
			"--no-sandbox",
			"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7", // 模拟user-agent,防反爬
		},
	}
	caps.AddChrome(chromeCaps)
	return opts, caps
}

// 爬虫启动
func (c Crawler) startChrome(path string, opts []selenium.ServiceOption, caps selenium.Capabilities) (*selenium.Service, selenium.WebDriver) {
	// 启动chromedriver,端口号可自定义
	service, err := selenium.NewChromeDriverService(path, 9999, opts...)
	if err != nil {
		log.Printf("Error starting the ChromeDriver server: %v", err)
	}

	// 调起chrome浏览器
	webDriver, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 9999))
	if err != nil {
		panic(err)
	}
	//defer service.Stop()   // 停止chromedriver
	//defer webDriver.Quit() // 关闭浏览器
	return service, webDriver
}

func main() {
	driverPath := "/Users/tu/Desktop/my_beego/note/chromedriver" //准备工作中下载driver
	crawler := Crawler{}
	opts, caps := crawler.config()
	service, driver := crawler.startChrome(driverPath, opts, caps)

	targetUrl := "https://www.baidu.com"
	err := driver.Get(targetUrl)
	if err != nil {
		panic(fmt.Sprintf("Failed to load page: %s\n", err))
	}

	result, err := driver.PageSource()

	// 将结果写入goquery中,以便用css选择器过滤标签
	doc, err := goquery.NewDocumentFromReader(strings.NewReader(result))
	if err != nil {
		panic(fmt.Sprintf("Failed: %s\n", err))
	}
	doc.Find("#s-top-left").Each(func(i int, s *goquery.Selection) {
		text := s.First().Text()
		fmt.Println(text)
	})

	time.Sleep(time.Duration(5) * time.Second)

	service.Stop() // 停止chromedriver
	driver.Quit()  // 关闭浏览器

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值