1.1. 前言

有的网站存在反爬机制,有的网站存在复杂的前端加密等等情况

这个时候就可以用selenium来模拟用户操作,简化我们的分析绕过时间

推荐:https://github.com/tebeka/selenium

1.2. 安装

安装这个依赖包

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

下载依赖

# 找到刚才下载的源码的路径
# 我的在 $GOPATH/pkg/mod/github.com/tebeka/[email protected]/
cd vendor
go run init.go --alsologtostderr  --download_browsers --download_latest

[!WARNING|style:flat]

下载依赖可能会遇到问题,没问题最好

手动安装:对应不同类型的浏览器进行安装 WebDriver,Google Chrome 需要安装 ChromeDriver,Firefox 则需要安装 geckodriver

安装的driver版本一定要和浏览器版本一致

1.3. 基础使用

[!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)
}

1.4. 反爬

1.4.1. 使用firefox

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

1.4.2. 配置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 © d4m1ts 2022 all right reserved,powered by Gitbook该文章修订时间: 2022-01-14 09:32:54

results matching ""

    No results matching ""