前段時間項目臨時需要做一個數據爬蟲,因爲我不會用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的最新版本,
安裝依賴
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/
顯示這樣說明差不多成功了
接着我們安裝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
https://www.jianshu.com/p/31c...
https://blog.csdn.net/u013783...
http://chromedriver.storage.g...