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

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

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

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

1.一些基本的概念:

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

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

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

廢話很少說,開始幹golang

2.安裝ChromeDriver

centos上安裝:web

在/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 -ychrome

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

clipboard.png
顯示這樣說明差很少成功了api

接着咱們安裝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...

相關文章
相關標籤/搜索