問題背景
使用 Selenium 時有如下兩種情況:
(1)無界面的linux環境下
(2)想用Selenium做自動化測試或爬蟲,但又不想打開瀏覽器,以免拖慢速度
所以我們需要一種不用打開瀏覽器的使用 Selenium 的方法,之前多數用的是PhantomJS + Selenium的方法,但是我使用 PhantomJS + Selenium 時報錯:
Selenium support for PhantomJS has been deprecated, please use
headless
原來是二者已分手,我們只能使用另一種方法,提供一個虛擬的界面。
安裝xvfb以及pyvirtualdisplay
-
介紹
xvfb就是這麼一個提供虛擬界面的工具, 這個工具相當於一個wrapper, 給應用程序提供虛擬的 X server(X server是Linux系統裏面圖形接口服務器的簡稱,常見的有KDE和GNOME)。 -
安裝
在我的ubuntu16.04系統下,使用如下命令安裝
sudo apt-get install xvfb
- 驗證使用
Xvfb :99 -ac 2>/dev/null &
export DISPLAY=:99
firefox
- 安裝xvfb的python庫pyvirtualdisplay
pip install pyvirtualdisplay
安裝chrome, chromedriver和selenium
- 安裝selenium
pip install selenium
- 安裝chrome
(1) 安裝依賴包:
sudo apt-get install libxss1 libappindicator1 libindicator7
(2) 下載安裝包:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
(3)sudo dpkg -i google-chrome-stable_current_amd64.deb
(4)應該不需要這一步:
sudo apt-get install google-chrome
(5)卸載chrome
之前安裝chrome後發現版本和chromedriver沒對上,可以選擇修改其中任一版本,如果需要卸載,則可以用這個命令:
sudo apt-get remove google-chrome-stable
- 安裝chrome driver
因爲版本問題,最好手動下載一個zip放到服務器上然後安裝:
(1)下載安裝包
cd /usr/software
wget -N http://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip
或者在淘寶鏡像手動下載對應上一步chrome版本的chromedriver
淘寶鏡像: https://npm.taobao.org/mirrors/chromedriver/
下載後放入服務器的 /usr/software 路徑下
(2)安裝解壓縮工具unzip
sudo apt-get install unzip
(3)解壓縮+賦予可執行的權限
unzip chromedriver_linux64.zip
chmod +x chromedriver
(4)移動
sudo mv -f chromedriver /usr/local/share/chromedriver
mv -f 是強行覆蓋的意思
(5)建立軟連接
sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
(6)驗證chromedriver是否安裝成功:
chromedriver --version
使用
(1)不用實際打開瀏覽器的方式進行頁面截圖:
from pyvirtualdisplay import Display
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options
display = Display(visible=0, size=(1600, 900))
display.start()
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
url = "https://news.qq.com/a/20190626/003510.htm"
driver.get(url)
driver.save_screenshot(driver.title + “png”)
print (driver.title)
driver.quit()
print("end with quit")
(2)chrome_options說明
chrome_options.add_argument(’–no-sandbox’)
chrome_options.add_argument(’–disable-dev-shm-usage’)
chrome_options.add_argument(’–headless’) #無頭啓動瀏覽器
chrome_options.add_argument(’–disable-gpu’) #禁止使用硬件加速
chrome_options.add_argument(‘blink-settings=imagesEnabled=false’)
如果用來爬蟲,還可以設置不加載圖片等方法來進一步提高打開頁面速度
(3)截整個頁面
有些網頁內容很多,滾動條比較長,如果我們需要截這種頁面的全部內容的話,就需要知道這個頁面的實際高度和寬度,根據一個頁面的所有內容都在body中的情況,我們可以轉換思路爲通過selenium獲得這個頁面的body的長度和寬度
from pyvirtualdisplay import Display
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options
display = Display(visible=0)
display.start()
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
#chrome_options.add_argument('blink-settings=imagesEnabled=false')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.set_window_size(1028,3210)
url = "https://news.qq.com/a/20190626/003510.htm"
driver.get(url)
body_element = driver.find_elements_by_tag_name('body')
body_height = body_element[0].size.get('height')
body_width = body_element[0].size.get('width')
if body_height and body_width and int(body_height) > 0 and int(body_width) > 0:
print("set_window_size")
driver.set_window_size(int( body_width),int(body_height))
print(body_height,body_width)
imgpath = driver.title[:5] + ".png"
driver.save_screenshot(imgpath)
print(imgpath)
#driver.get_screenshot_as_file(imgpath)
print (driver.title)
driver.quit()
print("end with quit")