前段時間項目臨時須要作一個數據爬蟲,由於我不會用python,真tmd尷尬,就用golang來寫,最後我還tmd沒有用爬蟲框架,哎,接下來寫寫一下作這個爬蟲中使用到的一些技術,由於時間緊張,因此要是中間有問題請大佬指正。html
這是一個公衆號爬蟲,主要是爲了爬取頭條號,熊掌號,大魚號等公衆號。 對於通常的使用API的公衆號實際上是要稍微簡單的,咱們只須要模擬請求他的API就能夠了,可是對於熊掌號,大魚號這種,由於他是沒有直接的入口的(反正我暫時沒有找到,要是大佬有找到的,懇請大佬不吝賜教)。而後就是對於頭條號這種了,由於頭條號是採用接口的形式,**可是** ,他是有接口簽名的,而且這個簽名還賊tmd難,因此咱們須要直接調用瀏覽器中的命令來獲取簽名。
要是文章中有什麼地方說錯了,請大佬賜教,感謝python
chrome-Headless: 顧明思議,是一種無瀏覽器窗口的模式,是Google 本身出的無頭瀏覽器模式, Google 針對 Chrome 瀏覽器 59版 新增長的一種模式,可讓你不打開UI界面的狀況下使用 Chrome 瀏覽器linux
ChromeDriver :WebDriver是一個開源工具,用於在許多瀏覽器上自動測試webapps。 ChromeDriver 是 google 爲網站開發人員提供的自動化測試接口,它是 selenium2 和 chrome瀏覽器 進行通訊的橋樑。具體webDriver和ChromeDriver的工做流程請移步。git
後面我還會再在代碼裏仔細講一下selenium和webDriver,ChromeDriver這三者之間的工做流程github
廢話很少說,開始幹:golang
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的最新版本,
安裝依賴
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
顯示這樣說明差很少成功了api
接着咱們安裝chromeDriver,首先咱們須要知道咱們應該chrome和chromeDriver的版本對比,而後去下載對應的版本
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是一對多的關係
因此他們三者的運行機制是:
參考內容: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...