前言

有的网站存在反爬机制,有的网站存在复杂的前端加密等等情况
这个时候就可以用selenium来模拟用户操作,简化我们的分析绕过时间
推荐:https://github.com/tebeka/selenium

安装

安装这个依赖包

  1. go get -t -d github.com/tebeka/selenium

下载依赖

  1. # 找到刚才下载的源码的路径
  2. # 我的在 $GOPATH/pkg/mod/github.com/tebeka/selenium@v0.9.9/
  3. cd vendor
  4. 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的方法都差不多

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/tebeka/selenium"
  5. "io/ioutil"
  6. "os"
  7. )
  8. const (
  9. chromeDriverPath = "/usr/local/bin/chromedriver"
  10. port = 12345
  11. )
  12. func main() {
  13. // 创建driver服务实例
  14. options := []selenium.ServiceOption{
  15. //selenium.GeckoDriver(geckoDriverPath), // Specify the path to GeckoDriver in order to use Firefox.
  16. selenium.Output(os.Stderr),
  17. }
  18. selenium.SetDebug(true)
  19. service, err := selenium.NewChromeDriverService(chromeDriverPath, port, options...)
  20. if err != nil {
  21. panic(err)
  22. }
  23. defer service.Stop()
  24. // 连接到本地运行的WebDriver实例。
  25. caps := selenium.Capabilities{
  26. "browserName": "chrome",
  27. }
  28. wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
  29. if err != nil {
  30. panic(err)
  31. }
  32. defer wd.Quit()
  33. // 发起请求
  34. _ = wd.Get("http://www.baidu.com/")
  35. // 截屏
  36. img, _ := wd.Screenshot()
  37. _ = ioutil.WriteFile("a.png", img, 0666)
  38. element, _ := wd.FindElement(selenium.ByID, "kw")
  39. _ = element.Clear()
  40. // 方法一
  41. _ = element.SendKeys("123123")
  42. // 方法二
  43. //_ = element.SendKeys(`
  44. // package main
  45. // import fmt
  46. // func main(){
  47. // fmt.Println("hello")
  48. // }
  49. // `)
  50. button, _ := wd.FindElement(selenium.ByID, "su")
  51. _ = button.Click()
  52. source, _ := wd.PageSource()
  53. fmt.Println(source)
  54. // 避免直接关闭chromnium页面,构造一个输入
  55. var name string
  56. fmt.Scanln(&name)
  57. }

反爬

使用firefox

https://gist.github.com/jacoduplessis/322d695d4cdab6ce866b939964588642

配置Chrome

  • Chrome启动参数大全 ``` / 利用Selenium去获取网页的源码,有的有反爬机制,返回源码 / func seleniumGetSource(url string) string { // 连接到本地运行的WebDriver实例。 caps := selenium.Capabilities{

    1. "browserName": "Google Chrome",

    } //禁止图片加载,加快渲染速度 imagCaps := map[string]interface{}{

    1. "profile.managed_default_content_settings.images": 2,

    } // chrome设置 chromeCaps := chrome.Capabilities{

    1. Prefs: imagCaps,
    2. Path: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
    3. Args: []string{
    4. //静默执行请求
    5. //"--headless", // 设置Chrome无头模式,在linux下运行,需要设置这个参数,否则会报错
    6. "--no-sandbox",
    7. "--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,防反爬,
    8. "--disable-blink-features=AutomationControlled", // 从 Chrome 88 开始,它的 V8 引擎升级了,加了这个参数,window.navigator.webdriver=false
    9. "--proxy-server=socks5://127.0.0.1:1080",
    10. },
    11. ExcludeSwitches: []string{
    12. "enable-automation", // 禁用左上角的控制显示
    13. },

    } caps.AddChrome(chromeCaps)

    wd, err := selenium.NewRemote(caps, fmt.Sprintf(“http://localhost:%d/wd/hub“, port)) if err != nil {

    1. 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 }

```