背景
最近一直在測試一個批量注冊賬號的腳本,由于腳本使用了國外代理proxy,速度十分緩慢,想到的解決方式是將腳步運行于outside server上,應該能提高代理速度。
通過查詢,selenium在服務器端可行的主要方式有兩種,一種是使用瀏覽器的headless模式,支持的瀏覽器很多,chrome\firefox等;另一種是使用虛擬的顯示模式,在linux上安裝xvfb等虛擬顯示程序實現(xiàn)瀏覽器的運行。這里,由于我想對腳本的運行情況進行監(jiān)控,延伸使用了vnc技術,核心vncserver(xvnc)與xvfb類似,只是可以通過客戶端vnc view查看遠程服務器的GUI和瀏覽器的運行情況。(備注:xvfb了解到的情況是也可以通過x11的客戶端共享遠程服務器內存,實現(xiàn)同樣的效果,有興趣的朋友可以自行查看,我沒有深入了解)。
測試環(huán)境
OS: centos 7
selenium 3.11.0
python 3.5.1
Google Chrome 65.0.3325.181
virtual
這些程序的安裝都是很簡單的就不記錄了。
一、chrome headless mode
chrome在前期的版本中是沒有headless模式的,在近幾次版本的更新中加入了headless mode.
提及的程序安裝略過,需要注意的是一下幾點:
1. 對于新建的項目建議使用# virtualenv隔離環(huán)境
2.將最新的chromedriver linux 版本放入項目bin目錄
3.chrome設計的時候是不允許root用戶直接使用的。為了程序的正常運行,需要添加額外的參數(shù) '--no-sandbox'
通過一個簡單的腳本測試可行性:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('headless')
chrome_options.add_argument('no-sandbox')
#chrome_options.add_argument('--window-size=1920x1080')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('http://www.baidu.com')
test = driver.find_element_by_id('u1')
testa = test.find_elements_by_tag_name('a')[1].text
print(testa)
driver.quit()
測試代碼顯示了想要的結果。
二、VNCSERVER 、VNC VIEW
上面的headless模式雖然可以成功執(zhí)行代碼,但是無法觀察代碼執(zhí)行情況,需要額外寫很多提示語才能知道代碼運行中的情況。VNC提供了一個方便的方式,可以在本地客戶端,查看遠程服務器端GUI
步驟如下:
1. 安裝服務器桌面環(huán)境
sudo yum groupinstall -y "GNOME Desktop"
安裝成功后重啟服務器: sudo reboot
2.安裝TigerVNC Server
sudo yum install -y tigervnc-server
3.配置vncserver
sudo cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
vncserver@:1.service 代表的是一個vnc服務,如果設置多個,可以配置多個文件 vncserver@:2.service vncserver@:3.service 等
然后進行配置
sudo vi /etc/systemd/system/vncserver@:1.service

修改<USER>部分,我目前使用的是root賬號
PIDFILE這里的位置需要刪除/home變?yōu)?br> /root/.vnc/%H%i.pid
保存后執(zhí)行如下代碼:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@:1.service
4.設置vnc賬號密碼用于vnc客戶端登陸
切換到你要使用的賬號,運行: vncserver
這里會提示你輸入密碼,密碼隨意
5.開啟vncserver
sudo systemctl start vncserver@:1.service
還可以查看vncserver狀態(tài)
sudo systemctl status vncserver@:1.service
6.設置防火墻
sudo systemctl start firewalld
sudo firewall-cmd --permanent --zone=public --add-port=5901-5905/tcp
端口設置根據(jù)自己的情況設置,如果前面的vncserver@:1.service為1,端口就是5901.
7.客戶端登陸
下載vnc view客戶端
登陸服務器

密碼登陸后:

目前為止,VNC 設置完成了
8.運行selenium代碼
與在本機運行情況相同,在運行前終端輸入 export DISPLAY=:1
這里的數(shù)字也是前面設置的端口數(shù)字。
好了整個centos 桌面GUI 環(huán)境就完成了。
需要注意的幾點是:
1.服務器最好選用內存大一些的,不然會出現(xiàn)很多無法解決的錯誤。
2.目前國內國外網(wǎng)上關于VNC設置的教程都是老版本,在設置vncserver@:1.service時按照文檔提示進行設置,尤其注意如果使用root用戶進行設置,一定要去掉PIDFILE路徑的/home.