下面是我正在使用的代码-我试图使其尽可能简洁。
import selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import bs4
options=Options()
#options.add_argument('--headless') # Works while not headless?
options.add_argument('--disable-gpu') # Last I checked this was necessary.
options.add_argument("--user-data-dir=profiles\\") #Keeps login data
options.add_argument("--profile-directory=Profile 1")
driver=webdriver.Chrome(chrome_options=options)
driver.get("http://www.google.com")
html=driver.page_source
soup=bs4.BeautifulSoup(html, "html.parser")
print(soup)
主要问题来自--user-data-dir
和--profile-directory
参数。在我的测试示例中,当前目录中有一个自定义的chrome配置文件(通常在C:\Users\User\AppData\Local\Google\Chrome\User Data
中找到),以使其与当前运行的所有chrome会话区分开。
如果在使用上述参数时启用了--headless
参数,则驱动程序将挂起(CMD停留并且在Python命令行上不产生输出)。但是,如果未启用,则该窗口会弹出并按预期执行。
但是,--headless
确实可以在上述默认目录中使用任何配置文件时使用。
这是控制台输出;
[0120/222514.611:ERROR:gpu_process_transport_factory.cc(967)] Lost UI shared context.
DevTools listening on ws://127.0.0.1:59961/devtools/browser/ee317ed6-93c7-47c2-b26d-63647980ba0d
[0120/222514.619:ERROR:devtools_http_handler.cc(289)] Error writing DevTools active port to file
[0120/222514.624:ERROR:cache_util_win.cc(19)] Unable to move the cache: 0
[0120/222514.625:ERROR:cache_util.cc(140)] Unable to move cache folder profiles\Default\GPUCache to profiles\Default\old_GPUCache_000
[0120/222514.625:ERROR:disk_cache.cc(184)] Unable to create cache
[0120/222514.625:ERROR:shader_disk_cache.cc(622)] Shader Cache Creation failed: -2
因此,似乎Chromium在某处假设我正在使用Default
个人资料,而实际上我指定自己没有。
有人有什么建议吗?预先感谢!
答案 0 :(得分:2)
我能够为您的代码添加以下选项来运行。
options.add_argument('--remote-debugging-port=45447')
没有它,代码将挂起一分钟左右,然后引发以下错误:
WebDriverException: Message: unknown error: DevToolsActivePort file doesn't exist
评论摘录,向我指出了一个解决方案:
当您将--remote-debugging-port = 0发送给Chrome时,devtools会选择 自己的端口,并将其作为文件写入chrome :: DIR_USER_DATA 名为“ DevToolsActivePort”。
基本上,一旦将端口设置为默认值0以外的其他值,就无需检查 DevToolsActivePort 文件。 完整的评论和错误在这里:chromedriver bug
希望这会有所帮助!
答案 1 :(得分:0)
我通过关闭命令提示符并在管理员模式下将其重新打开来解决此错误(右键单击cmd.exe,然后单击以管理员身份运行)。
没有其他作用。