常用 Selenium 或者 Puppeteer 的同窗都知道,啓動的 Chrome 瀏覽器分爲有頭模式和無頭模式node
若是是有頭模式,則會彈出一個 Chrome 瀏覽器窗口,而後你能看到這個瀏覽器裏面在自動操做;而無頭模式則不會彈出任何窗口,只有產生一個進程python
下面這篇文章中,咱們介紹了一個探測模擬瀏覽器特徵的網站web
juejin.cn/post/693048…chrome
經過他咱們能夠發現,在不作任何設置的狀況下,Selenium 或者 Puppeteer 啓動的瀏覽器有幾十個特徵可以被目標網站識別爲爬蟲,而且無頭模式的特徵比有頭模式的特徵多得多瀏覽器
也就是說,即便你不使用任何隱藏特徵的技術,僅僅使用有頭模式,你都會安全不少;若是網站不是很是嚴格的反爬蟲,不少狀況下,使用無頭模式更容易被發現,但使用有頭模式,更難被發現安全
下圖爲使用 有頭模式,不使用任何隱藏特徵的技術訪問檢測網站服務器
下圖爲不使用 無頭模式,不使用任何隱藏特徵的技術訪問檢測網站:markdown
因此,通常狀況下,你應該多使用有頭模式post
但問題在於,當咱們要在 Linux 服務器上面使用 Selenium 或者 Puppeteer 運行爬蟲的時候,就會發現有頭模式始終會報錯網站
這是由於,有頭模式須要系統提供圖形界面支持,才能繪製瀏覽器窗口,可是 Linux 服務器通常來講是沒有圖形界面的,因此有頭模式必定會失敗
在這種狀況下,爲了可以使用模擬瀏覽器的有頭模式,咱們須要搞一個假的圖形界面出來,從而欺騙瀏覽器,讓它的有頭模式可以正常使用
爲了達到這個目的,咱們可使用一個叫作 Xvfb的東西,這個東西在維基百科上面的介紹以下:
Xvfb 在一個沒有圖像設備的機器上實現了 X11顯示服務的協議,它實現了其餘圖形界面都有的各類接口,但並無真正的圖形界面
因此當一個程序在 Xvfb 中調用圖形界面相關的操做時,這些操做都會在虛擬內存裏面運行,只不過你什麼都看不到而已
使用 Xvfb,咱們就能夠欺騙 Selenium 或者 Puppeteer,讓它覺得本身運行在一個有圖形界面的系統裏面,這樣一來就可以正常使用有頭模式了
要安裝 Xvfb 很是簡單,以 Ubuntu 爲例,只須要執行下面兩行命令就能夠了:
sudo apt-get update
sudo apt-get install xvfb
複製代碼
如今,咱們來寫一段很是簡單的 Selenium 操做 Chrome 的代碼:
import time
from selenium.webdriver import Chrome
driver = Chrome('./chromedriver')
driver.get('https://bot.sannysoft.com/')
time.sleep(5)
driver.save_screenshot('screenshot.png')
driver.close()
print('運行完成')
複製代碼
若是直接在服務器上運行,效果以下圖所示:
因爲 Linux 服務器本來沒有圖形界面,因此程序一定會報錯
如今,咱們只須要在運行這段代碼的命令前面加上xvfb-run,再來看看運行效果:
代碼成功運行,沒有報錯
如今咱們從服務器上把這個生成的screenshot.png文件拉下來,打開之後能夠看到內容以下:
能夠看到,雖然窗口比較小,但確實是有頭模式下面的檢測結果
固然,咱們也能夠調整一下窗口大小,增長參數:xvfb-run python3 test.py -s -screen 0 1920x1080x16就能僞裝在一個分辨率爲 1920x1280 的顯示器上運行程序了
而後修改 Selenium 的代碼,設置瀏覽器窗口的大小:
運行效果以下圖所示:
本文演示僅僅使用的是 Python操做 Selenium,一樣你也能夠試一試使用 Puppeteer,只須要把啓動命令改成xvfb-run node index.js 便可!source:未聞Code