【爬蟲】Selenium + xvfb + chrome 實現無頭抓取

問題背景

使用 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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章