在 Linux 服務器中建立假桌面運行模擬瀏覽器有頭模式

常用 Selenium 或者 Puppeteer 的同窗都知道,他們啓動的 Chrome 瀏覽器分爲有頭模式和無頭模式。在本身電腦上操做時,若是是有頭模式,會彈出一個 Chrome 瀏覽器窗口,而後你能看到這個瀏覽器裏面在自動操做。而無頭模式則不會彈出任何窗口,只有進程。node

別去送死了。Selenium 與 Puppeteer 能被網站探測的幾十個特徵這篇文章中,咱們介紹了一個探測模擬瀏覽器特徵的網站。經過他咱們能夠發現,在不作任何設置的狀況下,Selenium 或者 Puppeteer 啓動的瀏覽器有幾十個特徵可以被目標網站識別爲爬蟲。而且,無頭模式的特徵比有頭模式的特徵多得多。python

也就是說,即便你不使用任何隱藏特徵的技術,僅僅使用有頭模式,你都會安全不少。若是網站不是很是嚴格的反爬蟲,不少狀況下,使用無頭模式更容易被發現,但使用有頭模式,更難被發現。web

下圖爲有頭模式,不使用任何隱藏特徵的技術訪問檢測網站:chrome

下圖爲無頭模式,不使用任何隱藏特徵的技術訪問檢測網站:瀏覽器

萬里河山一片紅

因此,通常狀況下,你應該多使用有頭模式。安全

但問題在於,當咱們要在 Linux 服務器上面使用 Selenium 或者 Puppeteer 運行爬蟲的時候,就會發現有頭模式始終會報錯。這是由於,有頭模式須要系統提供圖形界面支持,才能繪製瀏覽器窗口,可是 Linux 服務器通常來講是沒有圖形界面的,因此有頭模式必定會失敗。bash

在這種狀況下,爲了可以使用模擬瀏覽器的有頭模式,咱們須要搞一個假的圖形界面出來,從而欺騙瀏覽器,讓它的有頭模式可以正常使用。服務器

爲了達到這個目的,咱們可使用一個叫作 Xvfb的東西。這個東西在維基百科上面的介紹以下:網站

Xvfb or X virtual framebuffer is a display server implementing the X11 display server protocol. In contrast to other display servers, Xvfb performs all graphical operations in virtual memory without showing any screen output.

Xvfb 在一個沒有圖像設備的機器上實現了 X11顯示服務的協議。它實現了其餘圖形界面都有的各類接口,但並無真正的圖形界面。因此當一個程序在 Xvfb 中調用圖形界面相關的操做時,這些操做都會在虛擬內存裏面運行,只不過你什麼都看不到而已。spa

使用 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('運行完成')

若是直接在服務器上運行,效果以下圖所示:

由於沒有圖形界面,因此程序一定報錯。

如今,咱們只須要在運行這段代碼的命令前面加上xvfb-run,再來看看運行效果:

代碼成功運行,沒有報錯。如今咱們從服務器上把這個生成的screenshot.png文件拉下來,打開之後能夠看到內容以下:

能夠看到,雖然窗口比較小,但確實是有頭模式下面的檢測結果。固然,咱們也能夠調整一下窗口大小,增長參數:xvfb-run python3 test.py -s -screen 0 1920x1080x16就能僞裝在一個分辨率爲1920x1280的顯示器上運行程序了。而後修改 Selenium 的代碼,設置瀏覽器窗口的大小:

運行效果以下圖所示:

本文演示使用的是 Python操做 Selenium,你也能夠試一試使用 Puppeteer,只須要把啓動命令改成xvfb-run node index.js就能夠了。

有了本文之後,再結合我以前的兩篇文章:

相信你的模擬瀏覽器可以繞過更多的網站。

相關文章
相關標籤/搜索