Altair 使用 selenium chromedriver 自动保存图表
Altair automatic save chart using selenium chromedriver
由于 previous 已关闭,没有任何有用的解决方案,请再次询问。
我正在尝试循环生成一些图表并自动保存它们。
我正在 Windows,使用 Chrome。
我一直在关注 the documentation 如何在 svg 中保存图表。
我为我的 Chrome 版本下载了合适的 ChromeDriver。
gdf
是我的地理数据框,一切正常,我可以生成并手动保存图表。
此外,这个取自 chromium 文档的示例有效:
import time
from selenium import webdriver
driver = webdriver.Chrome('pathtochromedriver/chromedriver_win32/chromedriver.exe')
driver.get('http://www.google.com/');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()
下面是我正在尝试的代码 运行:
#Chromedriver for headless run and chart automatic save
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
####### None of the following work!
#driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'pathtochromedriver/chromedriver_win32/chromedriver.exe')
#driver = webdriver.Chrome(executable_path=r'pathtochromedriver/chromedriver_win32/chromedriver.exe')
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 窗格 (在后台),看起来像这样,这暗示了 chromedriver 工作顺利:
但是代码returns出现如下错误:
---------------------------------------------------------------------------
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
看看 Altair Saver 项目。
它使用 Chrome 驱动程序和 Selenium。
通过 pip 或 conda 安装。它可以保存到 svg:
from altair_saver import save
save((background + choro1_5), "{}.svg".format(bank))
您的代码不起作用的原因是您没有将驱动程序实例传递给 Altair,因此 Altair 正在创建默认驱动程序实例并在默认位置寻找 chromedriver。
Altair 目前不支持将自定义驱动程序实例传递给 save()
方法,因此无法按照您上面尝试的方式保存图形,除非可以在默认位置提供 chromedriver。
不过,我们正在使用 altair_saver 软件包对此进行改进。使用它,您可以将自定义驱动程序实例传递给保存方法:
from altair_saver import save
# ...
chart = background + choro1_5
filename = f"{bank}.svg"
save(chart, filename, method='selenium', webdriver=driver)
在未来的 Altair 版本中,这个更灵活的保护程序扩展将取代 Altair 当前的内置 chart.save()
方法。
@jakevdp 解决方案完美运行。以下是有关如何在 Windows 机器
上使用 selenium 和 chrome 驱动程序启用 .png 和 .svg 的完整步骤
pip install altair_saver
检查安装在 windows 系统中的 chrome 版本(Chrome 浏览器 > 帮助 > 版本)。比如版本是99.0.4844.xx,安装匹配的chromedriver如下
pip install chromedriver-binary=="99.0.4844.74"
从 chromium.org 下载 chrome 驱动程序并将其添加到环境变量 PATH 或者假设驱动程序的位置是 PATH_TO_CHROME_DRIVER_EXE
你的Python代码应该如下保存为png
from altair_saver import save
import selenium.webdriver
driver = selenium.webdriver.Chrome('PATH_TO_CHROME_DRIVER_EXE')
save(chart, "chart.png", method='selenium', webdriver=driver)
注意:altair_saver在各种操作系统的顶层installation部分记录了其中一些细节,供您参考。
由于 previous 已关闭,没有任何有用的解决方案,请再次询问。
我正在尝试循环生成一些图表并自动保存它们。
我正在 Windows,使用 Chrome。
我一直在关注 the documentation 如何在 svg 中保存图表。
我为我的 Chrome 版本下载了合适的 ChromeDriver。
gdf
是我的地理数据框,一切正常,我可以生成并手动保存图表。
此外,这个取自 chromium 文档的示例有效:
import time
from selenium import webdriver
driver = webdriver.Chrome('pathtochromedriver/chromedriver_win32/chromedriver.exe')
driver.get('http://www.google.com/');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()
下面是我正在尝试的代码 运行:
#Chromedriver for headless run and chart automatic save
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
####### None of the following work!
#driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'pathtochromedriver/chromedriver_win32/chromedriver.exe')
#driver = webdriver.Chrome(executable_path=r'pathtochromedriver/chromedriver_win32/chromedriver.exe')
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 窗格 (在后台),看起来像这样,这暗示了 chromedriver 工作顺利:
但是代码returns出现如下错误:
---------------------------------------------------------------------------
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
看看 Altair Saver 项目。 它使用 Chrome 驱动程序和 Selenium。 通过 pip 或 conda 安装。它可以保存到 svg:
from altair_saver import save
save((background + choro1_5), "{}.svg".format(bank))
您的代码不起作用的原因是您没有将驱动程序实例传递给 Altair,因此 Altair 正在创建默认驱动程序实例并在默认位置寻找 chromedriver。
Altair 目前不支持将自定义驱动程序实例传递给 save()
方法,因此无法按照您上面尝试的方式保存图形,除非可以在默认位置提供 chromedriver。
不过,我们正在使用 altair_saver 软件包对此进行改进。使用它,您可以将自定义驱动程序实例传递给保存方法:
from altair_saver import save
# ...
chart = background + choro1_5
filename = f"{bank}.svg"
save(chart, filename, method='selenium', webdriver=driver)
在未来的 Altair 版本中,这个更灵活的保护程序扩展将取代 Altair 当前的内置 chart.save()
方法。
@jakevdp 解决方案完美运行。以下是有关如何在 Windows 机器
上使用 selenium 和 chrome 驱动程序启用 .png 和 .svg 的完整步骤pip install altair_saver
检查安装在 windows 系统中的 chrome 版本(Chrome 浏览器 > 帮助 > 版本)。比如版本是99.0.4844.xx,安装匹配的chromedriver如下
pip install chromedriver-binary=="99.0.4844.74"
从 chromium.org 下载 chrome 驱动程序并将其添加到环境变量 PATH 或者假设驱动程序的位置是 PATH_TO_CHROME_DRIVER_EXE
你的Python代码应该如下保存为png
from altair_saver import save
import selenium.webdriver
driver = selenium.webdriver.Chrome('PATH_TO_CHROME_DRIVER_EXE')
save(chart, "chart.png", method='selenium', webdriver=driver)
注意:altair_saver在各种操作系统的顶层installation部分记录了其中一些细节,供您参考。