golang使用chrome+Selenium2.0+ChromeDriver使用總結
前段時間專案臨時需要做一個數據爬蟲,因為我不會用python,真tmd尷尬,就用golang來寫,最後我還tmd沒有用爬蟲框架,哎,接下來寫寫一下做這個爬蟲中使用到的一些技術,因為時間緊張,所以要是中間有問題請大佬指正。
這是一個公眾號爬蟲,主要是為了爬取頭條號,熊掌號,大魚號等公眾號。 對於一般的使用API的公眾號其實是要稍微簡單的,我們只需要模擬請求他的API就可以了,但是對於熊掌號,大魚號這種,因為他是沒有直接的入口的(反正我暫時沒有找到,要是大佬有找到的,懇請大佬不吝賜教)。然後就是對於頭條號這種了,因為頭條號是採用介面的形式,**但是** ,他是有介面簽名的,並且這個簽名還賊tmd難,所以我們需要直接呼叫瀏覽器中的命令來獲取簽名。
要是文章中有什麼地方說錯了,請大佬賜教,感謝
1.一些基本的概念:
chrome-Headless: 顧明思議,是一種無瀏覽器視窗的模式,是Google 自己出的無頭瀏覽器模式, Google 針對 Chrome 瀏覽器 59版 新增加的一種模式,可以讓你不開啟UI介面的情況下使用 Chrome 瀏覽器
ofollow,noindex" target="_blank">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的最新版本,
安裝依賴
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 --screenshothttps://www.suning.com/
顯示這樣說明差不多成功了
接著我們安裝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有關。 我們檢視本地執行緒:
發現只有一個chromeDriver.exe,說明 chromeDriver.exe和chrome.exe是一對多的關係
所以他們三者的執行機制是:
- 程式碼 selenium.NewChromeDriverService(seleniumPath, port, opts...)開啟一個chromeDriver程序
- 一個chromeDriver程序會管理很多chrome程序
- 一個webDriver例項對應一個瀏覽器視窗,例項的數量對應視窗的數量。
- 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