前言
有的网站存在反爬机制,有的网站存在复杂的前端加密等等情况
这个时候就可以用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 vendorgo 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 mainimport ("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 stringfmt.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 }
```
