【爬虫】Linux上使用selenium + chrome + xvfb 实现无界面的网页截图

部署运行你感兴趣的模型镜像

前言


本问介绍一种在无桌面(无 X server)的linux系统下,不用打开浏览器就可以完成网页页面截图的方法,之前多数用的是PhantomJS + Selenium的方法,但是我使用 PhantomJS + Selenium 时报错:

Selenium support for PhantomJS has been deprecated, please use
headless

原来是二者已分手,我们只能使用另一种方法,提供一个虚拟的界面。


安装xvfb以及pyvirtualdisplay


xvfb概述

X server是linux系统里面图形接口服务器的简称。windows系统的界面是这个系统不可分割的一部分,各种窗口操作界面显示都是由系统核心直接管理的,而linux的图形界面并比较常见的linux界面操作环境有KDE和GNOME,为它们提供系统支持的就是X server,而并非linux核心。

xvfb就是这么一个提供虚拟界面的工具, 这个工具相当于一个wrapper, 给应用程序提供虚拟的 X server(X server是Linux系统里面图形接口服务器的简称,常见的有KDE和GNOME)。

总结一句话就是 xvfb可以理解为虚拟的 linux界面,可以供应用程序使用。

安装xvfb

在ubuntu16.04系统下,使用如下命令安装

sudo apt-get install xvfb
验证使用
Xvfb :99 -ac 2>/dev/null &
export DISPLAY=:99   

firefox
安装pyvirtualdisplay

pyvirtualdisplay 是Xvfb 的python封装

pip install pyvirtualdisplay 



安装chrome, chromedriver和selenium


安装selenium
pip install selenium
安装chrome

1、安装依赖包:

  sudo apt-get install libxss1 libappindicator1 libindicator7

2、下载安装包:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

3、执行dpkg安装方式

sudo dpkg -i google-chrome-stable_current_amd64.deb 

4、卸载chrome

之前安装chrome后发现版本和chromedriver没对上,可以选择修改其中任一版本,如果需要卸载,则可以用这个命令:

sudo apt-get remove google-chrome-stable
安装chrome driver

1、下载安装包

cd /usr/software

wget -N http://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip

因为版本问题,最好手动下载一个zip格式的安装包,并上传到服务器:

在淘宝镜像手动下载对应上一步chrome版本的chromedriver

淘宝镜像: https://npm.taobao.org/mirrors/chromedriver/

下载后放入服务器的 /usr/software 路径下

2、安装解压缩工具unzip

sudo apt-get install unzip

如果出错可能需要修复 apt 工具

apt --fix-broken install

3、解压缩+赋予可执行的权限

unzip chromedriver_linux64.zip
chmod +x chromedriver

4、移动

# mv -f : 强行覆盖 
sudo mv -f chromedriver /usr/local/share/chromedriver

5、建立软连接

sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
 
sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

6、验证chromedriver是否安装成功:

chromedriver --version



实践


不用实际打开浏览器的方式进行页面截图:
from pyvirtualdisplay import Display
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options

display = Display(visible=0, size=(1600, 900))
display.start()
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

driver = webdriver.Chrome(chrome_options=chrome_options)
url = "https://news.qq.com/a/20190626/003510.htm"
driver.get(url)
driver.save_screenshot(driver.title + “png”)
print (driver.title)
driver.quit()     
print("end with quit")
chrome_options说明

chrome_options.add_argument(’–no-sandbox’)
chrome_options.add_argument(’–disable-dev-shm-usage’)
chrome_options.add_argument(’–headless’) #无头启动浏览器
chrome_options.add_argument(’–disable-gpu’) #禁止使用硬件加速

chrome_options.add_argument(‘blink-settings=imagesEnabled=false’)

如果用来爬虫,还可以设置不加载图片等方法来进一步提高打开页面速度

截整个页面

有些网页内容很多,滚动条比较长,如果我们需要截这种页面的全部内容的话,就需要知道这个页面的实际高度和宽度,根据一个页面的所有内容都在body中的情况,我们可以转换思路为通过selenium获得这个页面的body的长度和宽度

from pyvirtualdisplay import Display
from selenium import webdriver
import time

from selenium.webdriver.chrome.options import Options

display = Display(visible=0)
display.start()
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
#chrome_options.add_argument('blink-settings=imagesEnabled=false')
chrome_options.add_argument('--disable-gpu')

driver = webdriver.Chrome(chrome_options=chrome_options)
driver.set_window_size(1028,3210) 

url = "https://news.qq.com/a/20190626/003510.htm"
driver.get(url)

body_element = driver.find_elements_by_tag_name('body')
body_height = body_element[0].size.get('height')
body_width = body_element[0].size.get('width')
if body_height and body_width and int(body_height) > 0 and int(body_width) > 0:
    print("set_window_size")
    driver.set_window_size(int( body_width),int(body_height))
    print(body_height,body_width)
imgpath = driver.title[:5]  + ".png"
driver.save_screenshot(imgpath)
print(imgpath)
#driver.get_screenshot_as_file(imgpath)
print (driver.title)
driver.quit()     
print("end with quit")
网页截图中文显示为方框

原因:ubuntu系统中缺少支持的中文字体。

解决方案:

1、下载任意一款中文字体(ttf格式的字体),我选择的是simsun.ttc ,也就是宋体

2、将该字体文件放入/usr/share/fonts/路径下

3、依次执行如下命令使字体生效:

mkfontdir
mkfontscale
fc-cache -fv     #(最重要)

4、通过命令 fc-list :lang=zh 查看当前系统中支持中文的字体,如果出现simsun.ttc,则说明该字体已生效,再截图就会看到中文咯!

您可能感兴趣的与本文相关的镜像

<think>嗯,用户现在的问题是在无图形界面的openEuler环境下使用浏览器或找到替代方案。首先,我需要理解用户的具体需求。他们可能在服务器环境中,没有安装GUI,但又需要进行网页操作或调试,比如自动化测试、爬虫或者无头浏览器测试等。 接下来,我得回忆之前的回答中提到的解决方案,比如容器化部署、命令行浏览器,或者结合Web自动化工具。同时,用户提供的引用中提到信创系统使用Web技术渲染GUI,但需要浏览器支持,而用户现在没有图形界面,可能需要无头模式。 然后,考虑用户可能的场景:他们可能是在做自动化脚本、服务器端渲染、或者需要通过命令行访问网页内容。这时候,无头浏览器比如Headless Chrome或Firefox会是合适的选择。或者,使用文本浏览器如lynx或w3m进行简单的页面查看。 另外,之前的回答提到过容器化方案,比如用Docker或Podman运行浏览器,但需要X11转发,不过在无图形界面下可能需要其他方法。可能需要使用虚拟显示驱动,比如Xvfb,这样即使没有物理显示器也能运行图形应用。 还要考虑依赖问题,用户可能在安装浏览器时遇到依赖冲突,所以可能需要使用容器来隔离环境,或者使用预编译的二进制文件,比如下载Chrome的headless版本。 然后,用户可能需要一些具体的命令示例,比如如何启动无头浏览器,如何用curl或wget获取网页内容,或者使用Python的Selenium库进行自动化操作。同时,是否需要配置代理或处理证书问题。 最后,确保回答覆盖多种方法,包括命令行浏览器、无头模式、Web自动化工具,以及可能的替代方案如API调用,满足不同场景的需求。还要注意用户的环境是openEuler,可能需要特定的安装步骤或依赖处理。</think>在无图形界面的openEuler系统中使用浏览器或实现类似功能,可通过以下技术方案实现: --- ### **一、无头浏览器核心方案** #### 1. Headless Chrome/Firefox 通过虚拟显示驱动实现无界面渲染: ```bash sudo dnf install xorg-x11-server-Xvfb # 安装虚拟显示服务 Xvfb :99 -screen 0 1920x1080x24 & # 创建虚拟显示器 export DISPLAY=:99 # 设置环境变量 # 启动Firefox无头模式 firefox --headless --screenshot https://example.com # 网页截图[^1] ``` #### 2. Puppeteer自动化控制(Node.js环境) ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({args: ['--no-sandbox']}); const page = await browser.newPage(); await page.goto('https://example.com'); await page.pdf({path: 'output.pdf'}); await browser.close(); })(); ``` --- ### **二、命令行浏览器替代方案** #### 1. Lynx文本浏览器 ```bash sudo dnf install lynx # 安装纯文本浏览器 lynx -dump https://news.example.com # 将网页转为格式化文本 ``` #### 2. W3M高级功能 ```bash sudo dnf install w3m w3m-img # 支持内嵌图片显示 w3m -o display_image=1 https://example.com # 启用图片显示(需终端支持) ``` --- ### **三、API驱动型解决方案** #### 1. Curl自动化交互 ```bash # 模拟登录获取Cookie curl -X POST -d "user=admin&pass=123" -c cookies.txt https://login.example.com # 携带Cookie访问受限页面 curl -b cookies.txt https://dashboard.example.com | grep "关键数据" ``` #### 2. Postman CLI工具 ```bash npm install -g postman-cli postman login --username <api_key> # 配置API密钥 postman collection run "监控API集合" --env production # 执行预配置的API测试 ``` --- ### **四、远程调试协议** #### 1. Chrome DevTools Protocol (CDP) 通过WebSocket连接远程浏览器实例: ```python from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--remote-debugging-port=9222') driver = webdriver.Chrome(options=options) driver.get("https://target.site") ``` #### 2. Firefox Marionette ```bash firefox --marionette --headless # 启动Marionette协议 telnet localhost 2828 # 连接控制端口(需提前安装netcat) > getWindowHandles # 发送控制指令 ``` --- ### **五、容器化无头方案** #### 1. Selenium Grid容器集群 ```bash docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome python脚本通过http://localhost:4444/wd/hub 远程控制浏览器[^4] ``` #### 2. Playwright容器 ```bash docker run -it --rm mcr.microsoft.com/playwright:v1.32.0-focal \ node -e "const {webkit} = require('playwright');(async () => {const browser = await webkit.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await browser.close();})();" ``` --- ### **典型场景解决方案** #### 场景:网页自动化监控 ```bash # 使用Cron定时执行监控脚本 0 */2 * * * /usr/bin/firefox --headless --screenshot /var/log/site_monitor/$(date +\%Y\%m\%d-\%H\%M).png https://target.site ``` #### 场景:API接口测试 ```bash sudo dnf install bats # 安装Bash自动化测试框架 编写测试脚本: #!/usr/bin/env bats @test "检查API状态" { run curl -s -o /dev/null -w "%{http_code}" https://api.example.com/health [ "$status" -eq 0 ] [ "$output" -eq 200 ] } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值