前言

有的网站存在反爬机制,有的网站存在复杂的前端加密等等情况 这个时候就可以用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
    }
    
Copyright © aaron 2023 all right reserved,powered by Gitbook该文章修订时间: 2023-05-19 10:14:57

results matching ""

    No results matching ""