H5W3
当前位置:H5W3 > python > 正文

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

青南发布于 5 分钟前

经常使用 Selenium 或者 Puppeteer 的同学都知道,他们启动的 Chrome 浏览器分为有头模式和无头模式。在自己电脑上操作时,如果是有头模式,会弹出一个 Chrome 浏览器窗口,然后你能看到这个浏览器里面在自动操作。而无头模式则不会弹出任何窗口,只有进程。

别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征这篇文章中,我们介绍了一个探测模拟浏览器特征的网站。通过他我们可以发现,在不做任何设置的情况下,Selenium 或者 Puppeteer 启动的浏览器有几十个特征能够被目标网站识别为爬虫。并且,无头模式的特征比有头模式的特征多得多。

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

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

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

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

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

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

但问题在于,当我们要在 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('运行完成')

如果直接在服务器上运行,效果如下图所示:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

因为没有图形界面,所以程序必定报错。

现在,我们只需要在运行这段代码的命令前面加上xvfb-run,再来看看运行效果:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

代码成功运行,没有报错。现在我们从服务器上把这个生成的screenshot.png文件拉下来,打开以后可以看到内容如下:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

可以看到,虽然窗口比较小,但确实是有头模式下面的检测结果。当然,我们也可以调整一下窗口大小,增加参数:xvfb-run python3 test.py -s -screen 0 1920x1080x16就能假装在一个分辨率为1920×1280的显示器上运行程序了。然后修改 Selenium 的代码,设置浏览器窗口的大小:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

运行效果如下图所示:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

本文演示使用的是 Python操作 Selenium,你也可以试一试使用 Puppeteer,只需要把启动命令改为xvfb-run node index.js就可以了。

有了本文以后,再结合我之前的两篇文章:

  • 最完美方案!模拟浏览器如何正确隐藏特征
  • Chome 88如何正确隐藏 webdriver?

相信你的模拟浏览器能够绕过更多的网站。

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

python网页爬虫selenium
阅读 13发布于 5 分钟前
本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar

青南

微软最有价值专家(MVP)。已出版图书《Python 爬虫开发,从入门到实战》、《左手 MongoDB,右手 Redis——从入门到商业实战》。独立开发维护开源项目 GNE(获得近2000 Star)。

456 声望
25 粉丝

0 条评论
得票时间

avatar

青南

微软最有价值专家(MVP)。已出版图书《Python 爬虫开发,从入门到实战》、《左手 MongoDB,右手 Redis——从入门到商业实战》。独立开发维护开源项目 GNE(获得近2000 Star)。

456 声望
25 粉丝

宣传栏

经常使用 Selenium 或者 Puppeteer 的同学都知道,他们启动的 Chrome 浏览器分为有头模式和无头模式。在自己电脑上操作时,如果是有头模式,会弹出一个 Chrome 浏览器窗口,然后你能看到这个浏览器里面在自动操作。而无头模式则不会弹出任何窗口,只有进程。

别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征这篇文章中,我们介绍了一个探测模拟浏览器特征的网站。通过他我们可以发现,在不做任何设置的情况下,Selenium 或者 Puppeteer 启动的浏览器有几十个特征能够被目标网站识别为爬虫。并且,无头模式的特征比有头模式的特征多得多。

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

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

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

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

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

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

但问题在于,当我们要在 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('运行完成')

如果直接在服务器上运行,效果如下图所示:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

因为没有图形界面,所以程序必定报错。

现在,我们只需要在运行这段代码的命令前面加上xvfb-run,再来看看运行效果:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

代码成功运行,没有报错。现在我们从服务器上把这个生成的screenshot.png文件拉下来,打开以后可以看到内容如下:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

可以看到,虽然窗口比较小,但确实是有头模式下面的检测结果。当然,我们也可以调整一下窗口大小,增加参数:xvfb-run python3 test.py -s -screen 0 1920x1080x16就能假装在一个分辨率为1920×1280的显示器上运行程序了。然后修改 Selenium 的代码,设置浏览器窗口的大小:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

运行效果如下图所示:

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

本文演示使用的是 Python操作 Selenium,你也可以试一试使用 Puppeteer,只需要把启动命令改为xvfb-run node index.js就可以了。

有了本文以后,再结合我之前的两篇文章:

  • 最完美方案!模拟浏览器如何正确隐藏特征
  • Chome 88如何正确隐藏 webdriver?

相信你的模拟浏览器能够绕过更多的网站。

【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

本文地址:H5W3 » 【Python】在 Linux 服务器中创建假桌面运行模拟浏览器有头模式

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址