Python Altair使用selenium chromedriver自动将图表另存为svg
我试图在一个循环中生成几个图表并自动保存它们 我正在使用Chrome操作Windows 我一直在关注如何在svg中保存图表 我下载了适合我的Chrome版本的ChromeDriver。Python Altair使用selenium chromedriver自动将图表另存为svg,python,selenium,selenium-chromedriver,altair,Python,Selenium,Selenium Chromedriver,Altair,我试图在一个循环中生成几个图表并自动保存它们 我正在使用Chrome操作Windows 我一直在关注如何在svg中保存图表 我下载了适合我的Chrome版本的ChromeDriver。 gdf是我的地理数据框架,一切都很顺利,我可以生成并手动保存图表 下面是我正在尝试运行的一段代码: #Chromedriver for headless run and chart automatic save from selenium import webdriver driver = webdriver.
gdf
是我的地理数据框架,一切都很顺利,我可以生成并手动保存图表
下面是我正在尝试运行的一段代码:
#Chromedriver for headless run and chart automatic save
from selenium import webdriver
driver = webdriver.Chrome('pathtochromedriver/chromedriver_win32/chromedriver.exe')
#loop
for group in gdf['Group Name'].unique():
map_1km_json = json.loads(gdf[gdf['Group Name']==group].to_json())
map_1km_data = alt.Data(values=map_1km_json['features'])
data_1km_geojson = alt.InlineData(values=map_1km, format=alt.DataFormat(property='features',type='json'))
domain=[1,2]
range_=['#b0d247','#007bd1']
choro1_5 = alt.Chart(map_1km_data).mark_geoshape().encode(
alt.Color('properties.Cat2:O', scale=alt.Scale(domain=domain, range=range_),title = "Havvandsstigning"),
#alt.Color('properties.Cat2', type='quantitative', scale=alt.Scale(scheme='plasma'),title = "Havvandsstigning")
tooltip = ['properties.dd_km1:N','properties.Cat2:N']
).properties(
width=1100,
height=800
)
(background + choro1_5).save("{}.svg".format(bank))
driver.quit()
运行代码会打开一个空的新chrome窗格(在后台),如下所示:
但代码返回以下错误:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\selenium\webdriver\common\service.py in start(self)
75 stderr=self.log_file,
---> 76 stdin=PIPE)
77 except TypeError:
~\Anaconda3\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
774 errread, errwrite,
--> 775 restore_signals, start_new_session)
776 except:
~\Anaconda3\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
1177 os.fspath(cwd) if cwd is not None else None,
-> 1178 startupinfo)
1179 finally:
FileNotFoundError: [WinError 2] The system cannot find the file specified
During handling of the above exception, another exception occurred:
WebDriverException Traceback (most recent call last)
<ipython-input-27-6067387e4b2f> in <module>
19 height=800
20 )
---> 21 (background + choro1_5).save("{}.svg".format(bank))
22 driver.quit()
~\Anaconda3\lib\site-packages\altair\vegalite\v3\api.py in save(self, fp, format, override_data_transformer, scale_factor, vegalite_version, vega_version, vegaembed_version, **kwargs)
478 if override_data_transformer:
479 with data_transformers.disable_max_rows():
--> 480 result = save(**kwds)
481 else:
482 result = save(**kwds)
~\Anaconda3\lib\site-packages\altair\utils\save.py in save(chart, fp, vega_version, vegaembed_version, format, mode, vegalite_version, embed_options, json_kwds, webdriver, scale_factor, **kwargs)
102 vegaembed_version=vegaembed_version,
103 webdriver=webdriver,
--> 104 scale_factor=scale_factor, **kwargs)
105 if format == 'png':
106 write_file_or_filename(fp, mimebundle['image/png'], mode='wb')
~\Anaconda3\lib\site-packages\altair\utils\mimebundle.py in spec_to_mimebundle(spec, format, mode, vega_version, vegaembed_version, vegalite_version, **kwargs)
54 vega_version=vega_version,
55 vegaembed_version=vegaembed_version,
---> 56 vegalite_version=vegalite_version, **kwargs)
57 if format == 'png':
58 render = base64.b64decode(render.split(',', 1)[1].encode())
~\Anaconda3\lib\site-packages\altair\utils\headless.py in compile_spec(spec, format, mode, vega_version, vegaembed_version, vegalite_version, scale_factor, driver_timeout, webdriver)
152 webdriver_options.add_argument('--no-sandbox')
153
--> 154 driver = webdriver_class(options=webdriver_options)
155
156 try:
~\Anaconda3\lib\site-packages\selenium\webdriver\chrome\webdriver.py in __init__(self, executable_path, port, options, service_args, desired_capabilities, service_log_path, chrome_options, keep_alive)
71 service_args=service_args,
72 log_path=service_log_path)
---> 73 self.service.start()
74
75 try:
~\Anaconda3\lib\site-packages\selenium\webdriver\common\service.py in start(self)
81 raise WebDriverException(
82 "'%s' executable needs to be in PATH. %s" % (
---> 83 os.path.basename(self.path), self.start_error_message)
84 )
85 elif err.errno == errno.EACCES:
WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
---------------------------------------------------------------------------
FileNotFoundError回溯(最近一次调用上次)
启动中的~\Anaconda3\lib\site packages\selenium\webdriver\common\service.py(self)
75 stderr=self.log_文件,
--->76标准偏差=管道)
77除类型错误外:
初始化中的~\Anaconda3\lib\subprocess.py(self、args、bufsize、executable、stdin、stdout、stderr、preexec\fn、close\fds、shell、cwd、env、universal\u换行符、startupinfo、creationflags、restore\u信号、start\u new\u会话、pass\fds、编码、错误、文本)
774错误读取,错误写入,
-->775恢复信号,启动新会话)
776除:
执行子进程中的~\Anaconda3\lib\subprocess.py(self、args、executable、preexec\u fn、close\u fds、pass\u fds、cwd、env、startupinfo、creationflags、shell、p2cread、p2cwrite、c2pread、c2pwrite、errread、errwrite、未使用的恢复信号、未使用的启动新会话)
1177 os.fspath(cwd)如果cwd不是None-else-None,
->1178(创业信息)
1179最后:
FileNotFoundError:[WinError 2]系统找不到指定的文件
在处理上述异常期间,发生了另一个异常:
WebDriverException回溯(最近一次调用上次)
在里面
19高度=800
20 )
--->21(背景+choro1_5).保存(“{}.svg.”格式(银行))
22.退出
保存中的~\Anaconda3\lib\site packages\altair\vegalite\v3\api.py(self、fp、format、override\u data\u transformer、scale\u factor、vegalite\u version、vega\u version、vegaembed\u version、**kwargs)
478如果超越数据变压器:
479带有数据转换器。禁用最大行()
-->480结果=保存(**kwds)
481其他:
482结果=保存(**kwds)
保存中的~\Anaconda3\lib\site packages\altair\utils\save.py(图表、fp、vega\U版本、vegaembed\U版本、格式、模式、vegalite\U版本、嵌入选项、json\U kwds、webdriver、比例因子、**kwargs)
102 vegaembed_版本=vegaembed_版本,
103 webdriver=webdriver,
-->104比例系数=比例系数,**kwargs)
105如果格式==“png”:
106写入文件或文件名(fp,mimebundle['image/png'],mode='wb')
~\Anaconda3\lib\site packages\altair\utils\mimebundle.py在spec\u-to\u mimebundle中(spec、格式、模式、vega\u版本、vegaembed\u版本、vegalite\u版本、**kwargs)
54织女星版本=织女星版本,
55 vegaembed_版本=vegaembed_版本,
--->56 vegalite_版本=vegalite_版本,**kwargs)
57如果格式==“png”:
58 render=base64.b64解码(render.split(',,1)[1].encode())
编译规范中的~\Anaconda3\lib\site packages\altair\utils\headless.py(规范、格式、模式、vega版本、vegaembed版本、vegalite版本、比例因子、驱动程序超时、webdriver)
152 webdriver_选项。添加_参数('--no sandbox')
153
-->154驱动程序=webdriver\u类(选项=webdriver\u选项)
155
156尝试:
~\Anaconda3\lib\site packages\selenium\webdriver\chrome\webdriver.py in\uuuuuuu init\uuuuu(self、可执行路径、端口、选项、服务参数、所需功能、服务日志路径、chrome选项、保持活动状态)
71服务参数=服务参数,
72日志路径=服务日志路径)
--->73自助服务启动()
74
75尝试:
启动中的~\Anaconda3\lib\site packages\selenium\webdriver\common\service.py(self)
81提出WebDriverException(
82“'%s'可执行文件需要位于路径中。%s”%(
--->83 os.path.basename(self.path)、self.start\u错误消息)
84 )
85 elif err.errno==errno.EACCES:
WebDriverException:消息:“chromedriver”可执行文件需要位于路径中。请看https://sites.google.com/a/chromium.org/chromedriver/home
上述解决方案(顺便说一句,都是相同的)都没有解决我的问题。我已经给了chromedriver.exe
一个绝对路径,并在路径不起作用之前添加了可执行文件\u path=r
。当我遇到这个问题时,是因为我没有运行brew cask install chromedriver
,它将可执行文件安装到我路径上的某个位置。我相信当您使用altair进行保存时,它会查找与python分离的chromedriver可执行文件。您是否尝试将pathtochromedriver/chromedriver\u win32/chromedriver.exe
添加到您的路径,而不是使用selenium
导入路径?