前言
有的网站存在反爬机制,有的网站存在复杂的前端加密等等情况 这个时候就可以用selenium来模拟用户操作,简化我们的分析绕过时间 推荐:https://github.com/tebeka/selenium
安装
安装这个依赖包
go get -t -d github.com/tebeka/selenium
下载依赖
# 找到刚才下载的源码的路径
# 我的在 $GOPATH/pkg/mod/github.com/tebeka/selenium@v0.9.9/
cd vendor
go run init.go --alsologtostderr --download_browsers --download_latest
[!WARNING|style:flat] 下载依赖可能会遇到问题,没问题最好 手动安装:对应不同类型的浏览器进行安装
WebDriver
,Google Chrome 需要安装 ChromeDriver,Firefox 则需要安装 geckodriver 安装的driver版本一定要和浏览器版本一致
基础使用
[!NOTE] 示例:https://github.com/tebeka/selenium/blob/master/example_test.go 文档:https://pkg.go.dev/github.com/tebeka/selenium#readme-documentation
实例:打开baidu.com然后搜索123123 数据那一块和python操作Selenium的方法都差不多
package main
import (
"fmt"
"github.com/tebeka/selenium"
"io/ioutil"
"os"
)
const (
chromeDriverPath = "/usr/local/bin/chromedriver"
port = 12345
)
func main() {
// 创建driver服务实例
options := []selenium.ServiceOption{
//selenium.GeckoDriver(geckoDriverPath), // Specify the path to GeckoDriver in order to use Firefox.
selenium.Output(os.Stderr),
}
selenium.SetDebug(true)
service, err := selenium.NewChromeDriverService(chromeDriverPath, port, options...)
if err != nil {
panic(err)
}
defer service.Stop()
// 连接到本地运行的WebDriver实例。
caps := selenium.Capabilities{
"browserName": "chrome",
}
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
if err != nil {
panic(err)
}
defer wd.Quit()
// 发起请求
_ = wd.Get("http://www.baidu.com/")
// 截屏
img, _ := wd.Screenshot()
_ = ioutil.WriteFile("a.png", img, 0666)
element, _ := wd.FindElement(selenium.ByID, "kw")
_ = element.Clear()
// 方法一
_ = element.SendKeys("123123")
// 方法二
//_ = element.SendKeys(`
// package main
// import fmt
// func main(){
// fmt.Println("hello")
// }
// `)
button, _ := wd.FindElement(selenium.ByID, "su")
_ = button.Click()
source, _ := wd.PageSource()
fmt.Println(source)
// 避免直接关闭chromnium页面,构造一个输入
var name string
fmt.Scanln(&name)
}
反爬
使用firefox
https://gist.github.com/jacoduplessis/322d695d4cdab6ce866b939964588642
配置Chrome
- Chrome启动参数大全
/* 利用Selenium去获取网页的源码,有的有反爬机制,返回源码 */ func seleniumGetSource(url string) string { // 连接到本地运行的WebDriver实例。 caps := selenium.Capabilities{ "browserName": "Google Chrome", } //禁止图片加载,加快渲染速度 imagCaps := map[string]interface{}{ "profile.managed_default_content_settings.images": 2, } // chrome设置 chromeCaps := chrome.Capabilities{ Prefs: imagCaps, Path: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", Args: []string{ //静默执行请求 //"--headless", // 设置Chrome无头模式,在linux下运行,需要设置这个参数,否则会报错 "--no-sandbox", "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.11", // 模拟user-agent,防反爬, "--disable-blink-features=AutomationControlled", // 从 Chrome 88 开始,它的 V8 引擎升级了,加了这个参数,window.navigator.webdriver=false "--proxy-server=socks5://127.0.0.1:1080", }, ExcludeSwitches: []string{ "enable-automation", // 禁用左上角的控制显示 }, } caps.AddChrome(chromeCaps) wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port)) if err != nil { panic(err) } defer wd.Quit() // 发起请求 _ = wd.Get(url) time.Sleep(time.Second*5) source, _ := wd.PageSource() //res, _ := wd.ExecuteScriptRaw("console.log(\"123123\" + window.navigator.webdriver)", nil) //fmt.Println(string(res)) var x string _, _ = fmt.Scanln(&x) return source }