前段时间项目临时须要作一个数据爬虫,由于我不会用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...