共计 1823 个字符,预计需要花费 5 分钟才能阅读完成。
常常应用 Selenium 或者 Puppeteer 的同学都晓得,他们启动的 Chrome 浏览器分为有头模式和无头模式。在本人电脑上操作时,如果是有头模式,会弹出一个 Chrome 浏览器窗口,而后你能看到这个浏览器外面在主动操作。而无头模式则不会弹出任何窗口,只有过程。
别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特色这篇文章中,咱们介绍了一个探测模仿浏览器特色的网站。通过他咱们能够发现,在不做任何设置的状况下,Selenium 或者 Puppeteer 启动的浏览器有几十个特色可能被指标网站辨认为爬虫。并且,无头模式的特色比有头模式的特色多得多。
也就是说,即便你不应用任何暗藏特色的技术,仅仅应用有头模式,你都会平安很多。如果网站不是十分严格的反爬虫,很多状况下,应用无头模式更容易被发现,但应用有头模式,更难被发现。
下图为 有头模式,不应用任何暗藏特色的技术拜访检测网站:
下图为 无头模式,不应用任何暗藏特色的技术拜访检测网站:
所以,个别状况下,你应该多应用有头模式。
但问题在于,当咱们要在 Linux 服务器下面应用 Selenium 或者 Puppeteer 运行爬虫的时候,就会发现有头模式始终会报错。这是因为,有头模式须要零碎提供图形界面反对,能力绘制浏览器窗口,然而 Linux 服务器一般来说是没有图形界面的,所以有头模式肯定会失败。
在这种状况下,为了可能应用模仿浏览器的有头模式,咱们须要搞一个假的图形界面进去,从而坑骗浏览器,让它的有头模式可能失常应用。
为了达到这个目标,咱们能够应用一个叫做 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 中调用图形界面相干的操作时,这些操作都会在虚拟内存外面运行,只不过你什么都看不到而已。
应用 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
就能伪装在一个分辨率为 1920×1280 的显示器上运行程序了。而后批改 Selenium 的代码,设置浏览器窗口的大小:
运行成果如下图所示:
本文演示应用的是 Python 操作 Selenium,你也能够试一试应用 Puppeteer,只须要把启动命令改为 xvfb-run node index.js
就能够了。
有了本文当前,再联合我之前的两篇文章:
- 最完满计划!模仿浏览器如何正确暗藏特色
- Chome 88 如何正确暗藏 webdriver?
置信你的模仿浏览器可能绕过更多的网站。