pythonhtmlseleniumbokeh

Python open html file, take screenshot, crop and save as image


I am using the Bokeh package to generate maps to show the results of a simulation. The output is individual maps in html format with interactivity. The interactivity is needed for individual maps.

See this link for an example:

http://docs.bokeh.org/en/0.10.0/docs/gallery/texas.html

The simulation can automatically be set to run a number of times and will produce a map for each run. This could be 100's of maps. I would like to be able to stitch together the maps to create a movie - the interactivity is not required for this. Bokeh has functionality to create PNG files via the browser so it is possible to manually save each map as a file and use ffmpeg to create a movie. However this is not really an option if you need to do it for 100's of files. Currently there is no way to automatically generate PNG files via Bokeh but I believe it will be added at some point.

So I need a workaround. My thought is to open each html file from the location they are stored on the local drive, take a screen shot, crop the image to keep the required section and save. But I have not yet found a solution that works.

Cropping an image is easy:

from PIL import Image

img = Image.open(file_name)
box = (1, 1, 1000, 1000)
area = img.crop(box)
area.save('saved_image', 'jpeg')

My problem is opening the html file and taking the screen shot in the first place to feed to the above code.

For this I have tried the following but both require a URL rather than an html file. Also both use Firefox which doesn't work for me but I have installed chrome and altered the code appropriately.

How to take partial screenshot with Selenium WebDriver in python?

http://www.idiotinside.com/2015/10/20/take-screenshot-selenium-python/

My code for this is:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('file_name')
driver.save_screenshot('image.png')
driver.quit()

Which returns:

{"code":-32603,"message":"Cannot navigate to invalid URL"}

Clearly a filename is not a url so that is clear. It works fine if you pass it a website. Any help in getting a html loaded and a picture taken would be greatly appreciated! It does not have to involve Selenium.


Solution

  • As of Bokeh 0.12.6, it is now easier to take those screenshots directly from Python without needing to open a browser.

    Exporting PNGs looks like this

    export_png(plot, filename="plot.png")
    

    And exporting SVGs looks like this

    plot.output_backend = "svg"
    export_svgs(plot, filename="plot.svg")
    

    There are some optional dependencies that need to be installed. You can find more information in the Exporting Plots section of the User Guide.