golang使用chrome+Selenium2.0+ChromeDriver使用總結

前段時間項目臨時需要做一個數據爬蟲,因爲我不會用python,真tmd尷尬,就用golang來寫,最後我還tmd沒有用爬蟲框架,哎,接下來寫寫一下做這個爬蟲中使用到的一些技術,因爲時間緊張,所以要是中間有問題請大佬指正。

這是一個公衆號爬蟲,主要是爲了爬取頭條號,熊掌號,大魚號等公衆號。
   
對於一般的使用API的公衆號其實是要稍微簡單的,我們只需要模擬請求他的API就可以了,但是對於熊掌號,大魚號這種,因爲他是沒有直接的入口的(反正我暫時沒有找到,要是大佬有找到的,懇請大佬不吝賜教)。然後就是對於頭條號這種了,因爲頭條號是採用接口的形式,**但是** ,他是有接口簽名的,並且這個簽名還賊tmd難,所以我們需要直接調用瀏覽器中的命令來獲取簽名。

要是文章中有什麼地方說錯了,請大佬賜教,感謝

1.一些基本的概念:

chrome-Headless: 顧明思議,是一種無瀏覽器窗口的模式,是Google 自己出的無頭瀏覽器模式, Google 針對 Chrome 瀏覽器 59版 新增加的一種模式,可以讓你不打開UI界面的情況下使用 Chrome 瀏覽器

ChromeDriver :WebDriver是一個開源工具,用於在許多瀏覽器上自動測試webapps。 ChromeDriver 是 google 爲網站開發人員提供的自動化測試接口,它是 selenium2 和 chrome瀏覽器 進行通信的橋樑。具體webDriver和ChromeDriver的工作流程請移步。

後面我還會再在代碼裏仔細講一下selenium和webDriver,ChromeDriver這三者之間的工作流程

廢話不多說,開始幹

2.安裝ChromeDriver

centos上安裝:

在/etc/yum.repos.d/
下編輯文件 google-chrome.repo
     [google-chrome]
        name=google-chrome
        baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
        enabled=1
        gpgcheck=1
        gpgkey=https://dl.google.com/linux/linux_signing_key.pub
  使用yum -y install google-chrome-stable --nogpgcheck
  這裏我安裝的是chrome的最新版本,

clipboard.png

安裝依賴
yum install \
ipa-gothic-fonts \
xorg-x11-fonts-100dpi \
xorg-x11-fonts-75dpi \
xorg-x11-utils \
xorg-x11-fonts-cyrillic \
xorg-x11-fonts-Type1 \
xorg-x11-fonts-misc -y

安裝完畢之後,我們測試時候能運行
google-chrome-stable --no-sandbox --headless --disable-gpu --screenshot https://www.suning.com/

clipboard.png
顯示這樣說明差不多成功了

接着我們安裝chromeDriver,首先我們需要知道我們應該chrome和chromeDriver的版本對比,然後去下載對應的版本

3.Golang代碼

func main() {

    const (
        seleniumPath = `D:\workSoftware\chormdriver\chromedriver.exe`
        port            = 9515
    )

    //如果seleniumServer沒有啓動,就啓動一個seleniumServer所需要的參數,可以爲空,示例請參見https://github.com/tebeka/selenium/blob/master/example_test.go
    opts := []selenium.ServiceOption{}
    //opts := []selenium.ServiceOption{
    //    selenium.StartFrameBuffer(),           // Start an X frame buffer for the browser to run in.
    //    selenium.GeckoDriver(geckoDriverPath), // Specify the path to GeckoDriver in order to use Firefox.
    //}

    //selenium.SetDebug(true)
    service, err := selenium.NewChromeDriverService(seleniumPath, port, opts...)
    if nil != err {
        fmt.Println("start a chromedriver service falid", err.Error())
        return
    }
    //注意這裏,server關閉之後,chrome窗口也會關閉
    defer service.Stop()

    //鏈接本地的瀏覽器 chrome
    caps := selenium.Capabilities{
        "browserName": "chrome",
    }

    //禁止圖片加載,加快渲染速度
    imagCaps := map[string]interface{}{
        "profile.managed_default_content_settings.images": 2,
    }
    chromeCaps := chrome.Capabilities{
        Prefs: imagCaps,
        Path:  "",
        Args: []string{
            //"--headless", // 設置Chrome無頭模式,在linux下運行,需要設置這個參數,否則會報錯
            //"--no-sandbox",
            "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", // 模擬user-agent,防反爬
        },
    }
    //以上是設置瀏覽器參數
    caps.AddChrome(chromeCaps)


    // 調起chrome瀏覽器
    w_b1, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        fmt.Println("connect to the webDriver faild", err.Error())
        return
    }
    //關閉一個webDriver會對應關閉一個chrome窗口
    //但是不會導致seleniumServer關閉
    defer w_b1.Quit()
    err = w_b1.Get("https://zhuanlan.zhihu.com/p/37752206")
    if err != nil {
        fmt.Println("get page faild", err.Error())
        return
    }



    // 重新調起chrome瀏覽器
    w_b2, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        fmt.Println("connect to the webDriver faild", err.Error())
        return
    }
    defer w_b2.Close()
    //打開一個網頁
    err = w_b2.Get("https://www.toutiao.com/")
    if err != nil {
        fmt.Println("get page faild", err.Error())
        return
    }
    //打開一個網頁
    err = w_b2.Get("https://www.baidu.com/")
    if err != nil {
        fmt.Println("get page faild", err.Error())
        return
    }
    //w_b就是當前頁面的對象,通過該對象可以操作當前頁面了
    //........
    time.Sleep(5* time.Minute)
    return
}

在1基本概念中,我說道selenium和webDriver,ChromeDriver三者之間的關係,現在我通過代碼詳細說一下

通過運行上面的代碼,並查看系統進程 tasklist | find "chrome" ,

我們發現,我們起了兩個webDriver,w_b1,和w_b2,
其中w_b2打開了兩個網頁,但是最終網頁是baidu首頁,說明瀏覽器窗口個數和webDerver有關。
 
我們查看本地線程:

clipboard.png

發現只有一個chromeDriver.exe,說明
chromeDriver.exe和chrome.exe是一對多的關係

所以他們三者的運行機制是:

  1. 代碼 selenium.NewChromeDriverService(seleniumPath, port, opts...)打開一個chromeDriver進程
  2. 一個chromeDriver進程會管理很多chrome進程
  3. 一個webDriver實例對應一個瀏覽器窗口,實例的數量對應窗口的數量。
  4. selenium是通過開啓一個chromeDriver進程來實現對瀏覽器的操作和管理的

參考內容:https://www.jianshu.com/p/31c...

    https://juejin.im/entry/5add6fd3f265da0b7d0afafd
    https://github.com/tebeka/selenium/blob/master/example_test.go
       https://www.jianshu.com/p/31c8c9de8fcd
   https://www.jianshu.com/p/31c8c9de8fcd

https://www.jianshu.com/p/31c...
https://blog.csdn.net/u013783...
http://chromedriver.storage.g...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章