Chrome WebDriver for Selenium不支持--headless选项

6
我希望使用Selenium来运行一个无界面的Google Chrome实例,以从某些网站中挖掘数据,避免了UI开销。我从这里下载了ChromeDriver可执行文件,并将其复制到我的当前脚本目录。
该驱动程序似乎与Selenium一起正常工作,并能够自动浏览,但我似乎找不到无头选项。大多数在线使用Selenium和无头Chrome的示例大致如下:
import os  
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.chrome.options import Options  

chrome_options = Options()  
chrome_options.add_argument("--headless")  
chrome_options.binary_location = '/Applications/Google Chrome   Canary.app/Contents/MacOS/Google Chrome Canary'`    

driver = webdriver.Chrome(executable_path=os.path.abspath(“chromedriver"),   chrome_options=chrome_options)  
driver.get("http://www.duo.com")` 

然而,当我使用命令chromedriver -h检查Selenium WebDriver的可能参数时,我得到了以下内容:

D:\Jobs\scripts>chromedriver -h
Usage: chromedriver [OPTIONS]

Options
  --port=PORT                     port to listen on
  --adb-port=PORT                 adb server port
  --log-path=FILE                 write server log to file instead of stderr, increases log level to INFO
  --log-level=LEVEL               set log level: ALL, DEBUG, INFO, WARNING, SEVERE, OFF
  --verbose                       log verbosely (equivalent to --log-level=ALL)
  --silent                        log nothing (equivalent to --log-level=OFF)
  --append-log                    append log file instead of rewriting
  --replayable                    (experimental) log verbosely and don't truncate long strings so that the log can be replayed.
  --version                       print the version number and exit
  --url-base                      base URL path prefix for commands, e.g. wd/url
  --whitelisted-ips               comma-separated whitelist of remote IP addresses which are allowed to connect to ChromeDriver

没有可用的--headless选项。

从上面的链接获取的ChromeDriver是否允许无头浏览?


1
是的,就我所尝试的而言,我从未能在无头模式下运行Google Chrome。我刚刚转换到Firefox。 - DollarAkshay
1
我也能在macOS上以无头模式运行。 - ShivaGaire
4个回答

17

--headless不是用于chromedriver的参数,而是用于Chrome的参数。 --headless 运行 Chrome 以无头模式运行,即没有 UI 或显示服务器依赖项。ChromeDriver 是一个单独的可执行文件,WebDriver 使用它来控制 Chrome,而 Webdriver 则是一组特定于语言的绑定,用于驱动浏览器。

通过这组选项,我可以在无头模式下运行。希望这会有所帮助:

from bs4 import BeautifulSoup, NavigableString
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
import requests
import re  
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=options)  # see edit for recent code change.
browser.implicitly_wait(20)

2019年8月12日更新:

原代码: browser = webdriver.Chrome(chrome_options=options)

新代码: browser = webdriver.Chrome(options=options)


但是可执行文件没有“无头(headless)”选项...那么options.add_argument('--headless')这行代码是做什么用的? - user32882
正如 @ewwink 所建议的那样,这是用于 Chrome 的 --headless 模式,在没有 UI 或显示服务器依赖的情况下运行 Chrome。ChromeDriver 是 WebDriver 使用的单独可执行文件,用于控制 Chrome。Webdriver 是一组特定于语言的绑定,用于驱动浏览器。 - ShivaGaire
1
让我直接说吧... chromedriver.exe 本身会在某个时刻调用 Chrome.exe. 思路是让它用一个额外的参数来调用驱动程序? - user32882
1
谢谢,很好地解决了问题。是的,“chrome_options”已经被弃用,所以必须使用“options”。 - spritecodej

6

尝试

options.headless=True

以下是我如何设置我的无头 Chrome

options = webdriver.ChromeOptions()
options.headless=True
options.add_argument('window-size=1920x1080')
prefs = {
"download.default_directory": r"C:\FilePath\Download",
"download.prompt_for_download": False,
"download.directory_upgrade": True}
options.add_experimental_option('prefs', prefs)
chromedriver = (r"C:\Filepath\chromedriver.exe")

2

--headless 不是 chromedriver 的参数,而是 Chrome 的参数。你可以在这里查看更多 Chrome 的参数或命令行开关


0
正如许多答案正确地指出的那样,无头模式是Chrome的一个选项,而不是ChromeDriver的选项。
此外:
- 自Chrome 109版本以来,有一个名为`--headless=new`的选项,它将使用完全相同的Chrome。在此之前,Chrome和无头Chrome是两个不同的可执行文件(都是由Chrome安装程序和软件包安装的)。 - 有些答案建议使用`options.headless=True`。请不要这样做。请参阅Headless is Going Away!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接