用Golang做 爬虫 ,当面对页面存在复杂的JS的情况,使用普通的http.get或者http.post,如不做特殊处理,将无法解析页面源代码。
在使用 python 的过程中,可以使用 selenium 进行爬取数据,或使用selenium自动化测试,那么用Golang怎么处理这个问题呢?
其实Golang中也有selenium,Selenium 作为一个用于 Web 应用程序测试的工具,可以模拟真实浏览器进行操作,也可以实现鼠标点击、滚轮、输入等用户日常操作。
我们通过2节课的学习,实现1、 ;2、 。
1、本地启动selenium服务
配置环境
1、下载"github.com/tebeka/selenium"模块
2、下载 chrome 浏览器
3、下载chrome版本一致的chromedriver.exe
源码及解析
package main
import (
"fmt"
"github.com/tebeka/selenium"
"log"
"os"
)
const (
chromeDriverPath = "chromedriver.exe"
port = 9515
)
func main() {
//ServiceOption配置一个服务实例。
opts := []selenium.ServiceOption{
//在控制台输出调试信息
selenium.Output(os.Stderr),
}
//SetDebug设置调试模式
selenium.SetDebug(true)
//NewChromeDriverService在后台启动一个ChromeDriver实例。
service, err := selenium.NewChromeDriverService(chromeDriverPath, port, opts...)
if err != nil {
//Panic仅作为示例,不建议使用。
panic(err)
}
//Stop关闭WebDriver服务
//如果有虚拟帧缓冲区启动,则关闭X虚拟帧缓冲区。
defer service.Stop()
// 连接到本地运行的WebDriver实例。
// 功能配置WebDriver进程和目标浏览器,带有标准和特定于浏览器的选项。
caps := selenium.Capabilities{"browserName": "chrome"}
//NewRemote创建新的远程客户端,启动一个新的会话。
//urlPrefix:Selenium服务器的URL必须以协议(http, https,…)为前缀。
//如果urlPrefix是空字符串,则默认使用DefaultURLPrefix。
wd, err := selenium.NewRemote(caps, fmt.Sprintf("#34;, port))
if err != nil {
panic(err.Error())
}
//Quit结束当前会话。
//浏览器实例将被关闭。
defer wd.Quit()
//Get将浏览器打开提供的URL。
if err := wd.Get("#34;); err != nil {
panic(err)
}
for {
//PageSource返回当前页面的源代码。
source, err := wd.PageSource()
if err != nil {
return
}
log.Println(source)
}
}