常用 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