让 Selenium 在 Linux 中以有头模式运行

798 阅读4分钟

教你一招,让 Selenium 在 Linux 中以有头模式运行

经常使用 Selenium 或者 Puppeteer 的同学都知道,启动的 Chrome 浏览器分为有头模式和无头模式

如果是有头模式,则会弹出一个 Chrome 浏览器窗口,然后你能看到这个浏览器里面在自动操作;而无头模式则不会弹出任何窗口,只有产生一个进程

下面这篇文章中,我们介绍了一个探测模拟浏览器特征的网站

juejin.cn/post/693048…

通过他我们可以发现,在不做任何设置的情况下,Selenium 或者 Puppeteer 启动的浏览器有几十个特征能够被目标网站识别为爬虫,并且无头模式的特征比有头模式的特征多得多

也就是说,即使你不使用任何隐藏特征的技术,仅仅使用有头模式,你都会安全很多;如果网站不是非常严格的反爬虫,很多情况下,使用无头模式更容易被发现,但使用有头模式,更难被发现

下图为使用 有头模式,不使用任何隐藏特征的技术访问检测网站

下图为不使用 无头模式,不使用任何隐藏特征的技术访问检测网站:

所以,一般情况下,你应该多使用有头模式

但问题在于,当我们要在 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