当前位置: 首页 > 科技观察

在Linux服务器中创建一个假桌面运行模拟浏览器的headed模式

时间:2023-03-14 17:31:35 科技观察

经常使用Selenium或者Puppeteer的同学都知道,他们启动的Chrome浏览器分为headed模式和headless模式。在自己的电脑上操作时,如果是head模式,会弹出一个Chrome浏览器窗口,然后就可以看到浏览器自动运行了。在无头模式下,不会弹出窗口,只会弹出进程。不要去死。网站可以检测到Selenium和Puppeteer的数十种特性在本文中,我们介绍了一个检测模拟浏览器特性的网站。通过他我们可以发现,无需任何设置,Selenium或Puppeteer启动的浏览器有几十种特性可以被目标网站识别为爬虫。此外,无头模式比有头模式具有更多功能。也就是说,即使您不使用任何隐藏特征技术,使用带头模式也会安全得多。如果网站反爬虫不是很严格,很多时候使用headless模式更容易被发现,而使用headed模式则更难被发现。下图为headed模式,不使用任何隐藏特征技术访问检测网站:下图为headless模式,不使用任何隐藏特征技术访问检测网站:千里江山山是红色的。因此,一般情况下,你应该多使用头部模式。但是问题是当我们想在Linux服务器上使用Selenium或者Puppeteer来运行爬虫的时候,会发现headed模式会一直报错。这是因为header模式需要系统提供图形界面支持来绘制浏览器窗口,而Linux服务器一般没有图形界面,所以header模式肯定会失败。在这种情况下,为了能够使用模拟浏览器的headed模式,我们需要创建一个伪造的图形界面来欺骗浏览器,使其headed模式能够正常使用。为此,我们可以使用一种叫做Xvfb的东西。维基百科[1]上对这个东西的介绍是这样的:Xvfb或Xvirtualframebuffer是一个实现了X11显示服务器协议的显示服务器。与其他显示服务器不同,Xvfb在虚拟内存中执行所有图形操作而不显示任何屏幕输出。Xvfb在没有图形设备的机器上实现X11显示服务器协议。它实现了其他GUI具有的各种接口,但没有真正的GUI。所以当一个程序在Xvfb中调用GUI相关的操作时,这些操作会在虚拟内存中运行,但是你什么也看不到。使用Xvfb,我们可以欺骗Selenium或者Puppeteer,让其认为它运行在一个图形界面的系统中,这样我们就可以正常使用headed模式了。安装Xvfb非常简单。在Ubuntu中,只需要执行下面两行命令:sudoapt-getupdatesudoapt-getinstallxvfb现在,让我们编写一个非常简单的Selenium操作Chrome的代码:importtimefromselenium.webdriverimportChromedriver=Chrome('./chromedriver')driver.get('https://bot.sannysoft.com/')time.sleep(5)driver.save_screenshot('screenshot.png')driver.close()print('Runcomplete')如果直接在服务器上运行,效果如下图所示:因为没有图形界面,所以程序肯定报错。现在,我们只需要在运行这段代码的命令前加上xvfb-run,然后看看运行效果:代码运行成功,没有报错。现在我们从服务器上拉下生成的screenshot.png文件。打开后可以看到如下内容:可以看到虽然窗口比较小,但是确实是header模式下的检测结果。当然我们也可以调整窗口大小,增加参数:xvfb-runpython3test.py-s-screen01920x1080x16可以假装在分辨率为1920x1280的显示器上运行程序。然后修改Selenium代码,设置浏览器窗口大小:运行效果如下图:本文演示使用Python操作Selenium,也可以尝试使用Puppeteer,只需将启动命令改为xvfb-runnode索引.js会做。本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。