在Python中進(jìn)行瀏覽器測(cè)試時(shí),一般我們會(huì)選擇selenium這樣的庫來簡(jiǎn)化我們工作量。而有些時(shí)候,為了對(duì)一些動(dòng)態(tài)數(shù)據(jù)進(jìn)行抓取,我們會(huì)選擇 PhantomJs 這樣的工具。而在selenium中我們也可以集成Phantomjs對(duì)應(yīng)的驅(qū)動(dòng),可以很方便的進(jìn)行對(duì)應(yīng)的操作。
在Phantomjs的官方網(wǎng)站上,我們可以看到類似如下的字樣:
在這里引申出1個(gè) headless mode 的概念。而phantomjs與我們常用瀏覽器的區(qū)別是,它不需要GUI界面也可以運(yùn)行,因此更為節(jié)省資源。
實(shí)際上,對(duì)于動(dòng)態(tài)數(shù)據(jù)的抓取問題對(duì)我來說已經(jīng)是很多年之前的事情,無論是基于Phantomjs的 casperjs ,還是使用Qt、GTK這樣的GUI包編寫瀏覽器來進(jìn)行操作,或者是這里要介紹的selenium的方式,都已經(jīng)成為過去式了。
而自從在新公司從事自然語言處理方面的工作后,對(duì)于這樣的問題實(shí)際上基本上都懶得動(dòng)手了,不如讓同事去做吧。
大概在1個(gè)月前,之前公司坐我隔壁的那個(gè)哥們寫了1個(gè)分布式的爬蟲框架(實(shí)際上關(guān)于這方面,個(gè)人覺得完全沒有必要,流行的scrapy和pyspider那個(gè)好用)時(shí)遇到了這樣1個(gè)問題,當(dāng)時(shí)他在selenium中使用Phantomjs對(duì)某個(gè)頁面進(jìn)行抓取,然后發(fā)現(xiàn)有些東西使用Phantomjs抓取不下來,然后只要使用firefox的方式來進(jìn)行。這個(gè)哥們的博客可以 點(diǎn)擊 。
而在不久前,chrome宣布支持 headless模式 ,而后firefox跟隨的新聞,再次勾起我無盡的回憶。
實(shí)際上,phantomjs這個(gè)工具對(duì)于Python的人來說很不習(xí)慣,而且還有一些莫名其妙的問題。那么,我們來談?wù)勗贔irefox和Chrome瀏覽器不原生支持headless模式下,如何使用selenium來實(shí)現(xiàn)headless模式進(jìn)行動(dòng)態(tài)數(shù)據(jù)的抓取。
在這里為了方便說明,我們?cè)?a href="javascript:;" onClick="javascript:tagshow(event, 'Linux');" target="_self">Linux環(huán)境下進(jìn)行操作,使用的版本如下:
Centos==6.8
Python==2.7.10
selenium==2.53.0
Firefox==45.0
在Linux中有1個(gè)很好用的工具xvfb,它是1個(gè)X服務(wù)可以用于在沒有顯示器的硬件和物理輸入設(shè)備上運(yùn)行,詳細(xì)的操作可以 參考 。而關(guān)于X服務(wù)的內(nèi)容,請(qǐng)自行百度。比較常見的例子在ssh中進(jìn)行X11轉(zhuǎn)發(fā)。
可以看到,在這里我們需要借助xvfb的方式來實(shí)現(xiàn)所謂的headless模式,實(shí)際上這個(gè)操作10分鐘完成了。
安裝必需的軟件包
在這里,我們通過如下的方式安裝需要的軟件包:
[cat@localhost ~]$ sudo yum install xdg-utils xorg-x11-server-Xvfb xorg-x11-xkb-utils
如果你使用的是基于Debian的系統(tǒng),比如Ubuntu,那么對(duì)應(yīng)的安裝方式可能為:
sudo aptitude install xdg-utils xvfb x11-xkb-utils
安裝xvfb的綁定
安裝完成xvfb綁定后,一般情況下我們會(huì)使用命令的方式來開啟虛擬顯示。而由于本人比較懶是1個(gè)特點(diǎn),因此我們直接將其與我們的腳本一起集成在一起。
在這里,我們安裝1個(gè) xvfbwrapper 的庫,這個(gè)庫用于在你的Python中開啟和關(guān)閉xfvb會(huì)話。
在這里,我們直接通過pip進(jìn)行安裝:
pip install xvfbwrapper
編寫對(duì)應(yīng)的代碼
安裝完綁定依賴后,我們終于可以愉快的開啟編寫代碼了,在這里我們先引入對(duì)應(yīng)的模塊:
from xvfbwrapper import Xvfb
接著我們實(shí)例化1個(gè)實(shí)例:
xvfb = Xvfb()
接著我們可以開啟及關(guān)閉其其會(huì)話了:
#!/usr/bin/env python
from selenium import webdriver
from xvfbwrapper import Xvfb
xvfb = Xvfb(width=1280,height=720)
xvfb.start()
print('Start...')
browser = webdriver.Firefox()
browser.get('http://52sox.com')
title = browser.title
print(title)
print("Clean...")
browser.close()
xvfb.stop()
在這里,我們將其與selenium進(jìn)行集成,在這里由于時(shí)間的關(guān)系,簡(jiǎn)單的用于獲取個(gè)人博客上的標(biāo)題。
下面我們進(jìn)行測(cè)試:
[cat@localhost ~]$ python headless.py
Start...
The Kite in the wind
Clean...
發(fā)現(xiàn)其可以正常的運(yùn)行。可以說,簡(jiǎn)單到?jīng)]有朋友。