如何在 Python 中使用 Selenium 运行无头 Chrome?

2025-02-10 08:57:00
admin
原创
68
摘要:问题描述:我正在尝试使用 selenium 的一些东西,我真的希望我的脚本能够快速运行。我认为使用无头 Chrome 运行我的脚本会使它更快。首先,这个假设正确吗,或者如果我使用无头驱动程序运行脚本是否无关系?我希望无头式 Chrome 能够正常工作,但不知何故它无法正常工作。我尝试了不同的方法,大多数人认为...

问题描述:

我正在尝试使用 selenium 的一些东西,我真的希望我的脚本能够快速运行。

我认为使用无头 Chrome 运行我的脚本会使它更快。

首先,这个假设正确吗,或者如果我使用无头驱动程序运行脚本是否无关系?

我希望无头式 Chrome 能够正常工作,但不知何故它无法正常工作。我尝试了不同的方法,大多数人认为它可以正常工作,正如 10 月更新中所述:

如何配置 ChromeDriver 以通过 Selenium 以 Headless 模式启动 Chrome 浏览器?

但是当我尝试时,我看到了奇怪的控制台输出,而且它似乎仍然不起作用。

任何建议都值得感激。


解决方案 1:

要运行 chrome-headless,只需添加--headlessvia chrome_options.add_argument,例如:

from selenium import webdriver 
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# chrome_options.add_argument("--disable-extensions")
# chrome_options.add_argument("--disable-gpu")
# chrome_options.add_argument("--no-sandbox") # linux only
chrome_options.add_argument("--headless=new") # for Chrome >= 109
# chrome_options.add_argument("--headless")
# chrome_options.headless = True # also works
driver = webdriver.Chrome(options=chrome_options)
start_url = "https://duckgo.com"
driver.get(start_url)
print(driver.page_source.encode("utf-8"))
# b'<!DOCTYPE html><html xmlns="http://www....
driver.quit()

所以我的想法是,使用无头 Chrome 运行它会让我的脚本更快。

--disable-extensions尝试使用类似或的chrome 选项--disable-gpu并对其进行基准测试,但我不会认为这会带来实质性的改进。


参考资料:headless-chrome

解决方案 2:

安装并运行容器化的 Chrome:

docker pull selenium/standalone-chrome
docker run --rm -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome

使用以下方式连接webdriver.Remote

driver = webdriver.Remote('http://localhost:4444/wd/hub', webdriver.DesiredCapabilities.CHROME)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')

解决方案 3:

from time import sleep

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")

driver = webdriver.Chrome(executable_path="./chromedriver", options=chrome_options)
url = "https://stackoverflow.com/questions/53657215/running-selenium-with-headless-chrome-webdriver"
driver.get(url)

sleep(5)

h1 = driver.find_element_by_xpath("//h1[@itemprop='name']").text
print(h1)

然后我在本地机器上运行脚本

➜ python script.py
Running Selenium with Headless Chrome Webdriver

它正在运行并且与无头 Chrome 一起使用。

解决方案 4:

--no-sandbox如果您使用的是 Linux 环境,您可能还必须添加特定的窗口大小设置。--no-sandbox如果您正确设置了用户容器,则在 Windows 上不需要该标志。

仅在 Windows 上使用--disable-gpu。其他平台不再需要它。该--disable-gpu标志是针对一些错误的临时解决方法。

//Headless chrome browser and configure
            WebDriverManager.chromedriver().setup();
            ChromeOptions chromeOptions = new ChromeOptions();
            chromeOptions.addArguments("--no-sandbox");
            chromeOptions.addArguments("--headless");
            chromeOptions.addArguments("disable-gpu");
//          chromeOptions.addArguments("window-size=1400,2100"); // Linux should be activate
            driver = new ChromeDriver(chromeOptions);

解决方案 5:

正如接受的答案所述:

options.add_argument("--headless")

这些技巧可能有助于加快速度,特别是对于无头系统:

很多事情你可以在无头模式下做,但在非无头模式下做不到

由于您将使用 Chrome Headless,我发现添加此功能可将 CPU 使用率降低约 20%(我在查看 htop 时发现这会占用大量 CPU 和内存)

禁用崩溃报告器

这只会在您无头运行时禁用这可能会加快您的速度!!!

我的设置目前如下,我将 CPU 减少了约 20%(但只节省了一点时间):

options.add_argument("--no-sandbox");
options.add_argument("--disable-dev-shm-usage");
options.add_argument("--disable-renderer-backgrounding");
options.add_argument("--disable-background-timer-throttling");
options.add_argument("--disable-backgrounding-occluded-windows");
options.add_argument("--disable-client-side-phishing-detection");
options.add_argument("--disable-crash-reporter");
options.add_argument("--disable-oopr-debug-crash-dump");
options.add_argument("--no-crash-upload");
options.add_argument("--disable-gpu");
options.add_argument("--disable-extensions");
options.add_argument("--disable-low-res-tiling");
options.add_argument("--log-level=3");
options.add_argument("--silent");

我发现这是一份非常好的命令行开关列表(我认为是完整列表),并附带说明:https://peter.sh/experiments/chromium-command-line-switches/

这里还提到了一些您可以关闭的其他功能:https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md

我希望这对某人有帮助

解决方案 6:

最近 Chrome 的无头模式进行了更新。该标志--headless现已修改,可按如下方式使用

  • 对于 Chrome 109 及以上版本,--headless=new标志允许我们在无头模式下探索 Chrome 浏览器的全部功能。

  • 对于 Chrome 版本 108 及以下版本(直到版本 96),--headless=chrome选项将为我们提供无头 Chrome 浏览器。

因此,让我们添加

options.add_argument("--headless=new")

适用于无头模式下较新版本的 Chrome,如上所述。

解决方案 7:

一旦安装了 selenium 和 web 驱动程序。下面是我在 Linux 集群上使用无头 Chrome 时使用的方法:

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--disable-extensions")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--no-sandbox")
options.add_experimental_option("prefs",{"download.default_directory":"/databricks/driver"})
driver = webdriver.Chrome(chrome_options=options)

解决方案 8:

Todo(在无头服务器 Debian Linux 9.4 上测试):

  1. 这样做:

# install chrome
curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
apt-get -y update
apt-get -y install google-chrome-stable

# install chrome driver
wget https://chromedriver.storage.googleapis.com/77.0.3865.40/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/chromedriver
chown root:root /usr/bin/chromedriver
chmod +x /usr/bin/chromedriver
  1. 安装硒:

pip install selenium

并运行以下 Python 代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("no-sandbox")
options.add_argument("headless")
options.add_argument("start-maximized")
options.add_argument("window-size=1900,1080"); 
driver = webdriver.Chrome(chrome_options=options, executable_path="/usr/bin/chromedriver")
driver.get("https://www.example.com")
html = driver.page_source
print(html)

解决方案 9:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(executable_path=r"C:Program 
FilesGoogleChromeApplicationchromedriver.exe", options=chrome_options)

对我来说这没问题。

解决方案 10:

在无头环境中运行 Chrome 有多种方式。(您可以在此答案中找到更多详细信息: https: //stackoverflow.com/a/73840130/7058266)

一、标准无头模式:(比有头模式更快,但可能会遇到兼容性问题。)

options.add_argument("--headless")

从 Chrome 109 开始,Chrome 推出了新的无头模式:(它的运行速度与有头模式相同,因为两者实际上是相同的。)

options.add_argument("--headless=new")

(在 Chrome 96 和 108 之间,该新模式曾经是--headless=chrome,但后来被重命名。)

如果使用无头显示器(例如 Xvfb)和控制它的 Python 程序(例如 pyvirtualdisplay),您还可以在无头环境中运行常规 Chrome。(请参阅https://stackoverflow.com/a/6300672/7058266https://stackoverflow.com/a/23447450/7058266

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

driver = webdriver.Chrome()
driver.get('http://www.google.com')
driver.quit()

display.stop()

为了提高兼容性,您可以尝试将上述内容与新的 Chrome 无头模式结合起来:

options.add_argument("--headless=new")

解决方案 11:

您可以在 Python 中使用Selenium运行无头 Chrome ,如下所示。 *--headless=new更好,因为根据Headless is Going Away!--headless使用旧的无头模式:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--headless=new") # Here
driver = webdriver.Chrome(options=options)

或者:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless=new") # Here
driver = webdriver.Chrome(options=options)

此外,以下示例可以使用无头 Chrome、Selenium、pytest-django和Django测试 Django Admin 。 *我的回答解释了如何使用多个无头浏览器(Chrome、Microsoft Edge 和 Firefox)、Selenium、pytest-django 和 Django 测试 Django Admin:

# "tests/test_1.py"

import pytest
from selenium import webdriver
from django.test import LiveServerTestCase

@pytest.fixture(scope="class")
def chrome_driver_init(request):
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")
    chrome_driver = webdriver.Chrome(options=options)
    request.cls.driver = chrome_driver
    yield
    chrome_driver.close()

@pytest.mark.usefixtures("chrome_driver_init")
class Test_URL_Chrome(LiveServerTestCase):
    def test_open_url(self):
        self.driver.get(("%s%s" % (self.live_server_url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title

或者:

# "tests/conftest.py"

import pytest
from selenium import webdriver

@pytest.fixture(scope="class")
def chrome_driver_init(request):
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")
    chrome_driver = webdriver.Chrome(options=options)
    request.cls.driver = chrome_driver
    yield
    chrome_driver.close()
# "tests/test_1.py"

import pytest
from django.test import LiveServerTestCase

@pytest.mark.usefixtures("chrome_driver_init")
class Test_URL_Chrome(LiveServerTestCase):
    def test_open_url(self):
        self.driver.get(("%s%s" % (self.live_server_url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用