Golang+selenium+chrome headless + goquery 在Linux 上作爬虫实践
🕕 Sat, 10 Nov 2018 by GolangNote
以前使用PhantomJS,但效果并不好,现在使用Golang+selenium 驱动 chrome headless 模式,再用 goquery 解析html 字符,很方便。
首先在服务器上安装最新版本的chrome 和 chromedriver
- chrome https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 21
- chromedriver https://sites.google.com/a/chromium.org/chromedriver/downloads 45
chrome headless 配置
启动 chrome 及简单配置
var opts []selenium.ServiceOption
caps := selenium.Capabilities{
"browserName": "chrome",
}
// 禁止加载图片,加快渲染速度
imgCaps := map[string]interface{}{
"profile.managed_default_content_settings.images": 2,
}
chromeCaps := chrome.Capabilities{
Prefs: imgCaps,
Path: "",
Args: []string{
"--headless",
"--start-maximized",
//"--window-size=1200x600",
"--no-sandbox",
"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"--disable-gpu",
"--disable-impl-side-painting",
"--disable-gpu-sandbox",
"--disable-accelerated-2d-canvas",
"--disable-accelerated-jpeg-decoding",
"--test-type=ui",
},
}
caps.AddChrome(chromeCaps)
// 启动 chromedriver server
service, err := selenium.NewChromeDriverService("chromedriver", port, opts...)
if err != nil {
log.Printf("Error starting the ChromeDriver server: %v", err)
return
}
defer service.Stop()
打开一个网页
// 打开 chrome 浏览器
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
if err != nil {
log.Println(err)
return
}
defer wd.Quit()
然后加载URL
err = wd.Get(curURL)
if err != nil {
log.Println(fmt.Sprintf("Failed to load page: %s\n", err))
}
判断加载完成
jsRt, err := wd.ExecuteScript("return document.readyState", nil)
if err != nil {
log.Println("exe js err", err)
}
fmt.Println("jsRt", jsRt)
if jsRt != "complete" {
log.Println("网页加载未完成")
return
}
获取网站内容
var frameHtml string
time.Sleep(1 * time.Second)
frameHtml, err = wd.PageSource()
if err != nil {
log.Println(err)
return
}
解析html 文件
这里推荐使用 https://github.com/PuerkitoBio/goquery 42
var doc *goquery.Document
doc, err = goquery.NewDocumentFromReader(bytes.NewReader([]byte(frameHtml)))
if err != nil {
log.Println(err)
return
}
doc.Find("li.s-result-item").Each(func(liIndex int, liItem *goquery.Selection) {
// do something
})
selenium go 驱动库
selenium https://github.com/tebeka/selenium 240
本文网址: https://golangnote.com/topic/232.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Relative Articles
Recent Go Articles
- Golang 把cookie 字符串解析为cookie 结构
- Golang 计算字符串中包含某个或某些字符集的个数
- 使用Golang 对文件增删写读操作备忘
- Go Modules 使用备忘
- 使用Golang 简单删除图片exif 信息
- 谷歌翻译的 golang 库推荐
- Go 1.13.2 与1.13.3 紧急更新
- golang 人脸检测识别库
- Go build 错误 “stackcheck redeclared in this block previous declaration”的解决方法
- Golang phantomjs 动态代理实现
- Golang chrome debug protocol 库推荐
- Golang 随机打乱数组/Slice
- Golang sync.WaitGroup 的 Wait 超时处理
- Golang实现简单的Socks5代理
- Golang 用snappy + Base64 简单压缩加密进行网络传输
- Golang http IPv4/IPv6 服务
- golang 全角半角相互转换
- 在自己的网站部署TLS 1.3
- Golang 实现/打印菜单树
- Golang telegram 机器人小试
Top Go Articles
- 使用Golang 简单删除图片exif 信息
- 谷歌翻译的 golang 库推荐
- Go 1.13.2 与1.13.3 紧急更新
- golang 人脸检测识别库
- Go build 错误 “stackcheck redeclared in this block previous declaration”的解决方法
- Golang phantomjs 动态代理实现
- Golang chrome debug protocol 库推荐
- Golang 随机打乱数组/Slice
- Golang sync.WaitGroup 的 Wait 超时处理
- Golang实现简单的Socks5代理
- Golang 用snappy + Base64 简单压缩加密进行网络传输
- Golang http IPv4/IPv6 服务
- golang 全角半角相互转换
- 在自己的网站部署TLS 1.3
- Golang 实现/打印菜单树
- Golang telegram 机器人小试
- Golang get 请求忽略数字证书进行校验
- Golang字符串相等比较的性能
- an error broken: unknown escape sequence: d
- golang 正确获取绝对路径的方法