I’m trying out Simon Willison’s shot-scraper to include a screenshot of the website for our JupyterCon 2023 tutorial in my blog post .
First install the shot-scraper
command line tool:
! pip3 install shot- scraper
Collecting shot-scraper
Downloading shot_scraper-1.2-py3-none-any.whl (15 kB)
Collecting click
Downloading click-8.1.3-py3-none-any.whl (96 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.6/96.6 kB 3.7 MB/s eta 0:00:00
Requirement already satisfied: PyYAML in /opt/homebrew/lib/python3.11/site-packages (from shot-scraper) (6.0)
Collecting playwright
Downloading playwright-1.33.0-py3-none-macosx_11_0_arm64.whl (31.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 31.2/31.2 MB 5.5 MB/s eta 0:00:0000:0100:01
Collecting click-default-group
Downloading click-default-group-1.2.2.tar.gz (3.3 kB)
Preparing metadata (setup.py) ... done
Collecting greenlet==2.0.1
Downloading greenlet-2.0.1-cp311-cp311-macosx_10_9_universal2.whl (259 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 259.4/259.4 kB 5.3 MB/s eta 0:00:00a 0:00:01
Collecting pyee==9.0.4
Downloading pyee-9.0.4-py2.py3-none-any.whl (14 kB)
Requirement already satisfied: typing-extensions in /opt/homebrew/lib/python3.11/site-packages (from pyee==9.0.4->playwright->shot-scraper) (4.5.0)
Building wheels for collected packages: click-default-group
Building wheel for click-default-group (setup.py) ... done
Created wheel for click-default-group: filename=click_default_group-1.2.2-py3-none-any.whl size=3383 sha256=816707e9974b43b6f04f2e646cf851f2e041f0c7cc25fcb67612fb4d72973d4f
Stored in directory: /Users/seem/Library/Caches/pip/wheels/69/9a/ed/1979767796ee1379d161a35fea9745a788476be12fb2ac664a
Successfully built click-default-group
Installing collected packages: pyee, greenlet, click, playwright, click-default-group, shot-scraper
Successfully installed click-8.1.3 click-default-group-1.2.2 greenlet-2.0.1 playwright-1.33.0 pyee-9.0.4 shot-scraper-1.2
[notice] A new release of pip is available: 23.0.1 -> 23.1.2
[notice] To update, run: python3.11 -m pip install --upgrade pip
Then install the underlying browser used by shot-scraper
:
We can now take a screenshot of any website!
! shot- scraper https:// fastai.github.io/ jupytercon- 2023 / -- output ../ posts/ images/ jupytercon- 2023 - tutorial.png -- width 1600 -- height 900
Here’s the image:
I want a resolution of 1600x900 but the font size is too small here. Halving the width and height and doubling the device scale factor with the --retina
flag should fix this:
! shot- scraper https:// fastai.github.io/ jupytercon- 2023 / -- output ../ posts/ images/ jupytercon- 2023 - tutorial.png -- width 800 -- height 450 -- retina
Finally, I want to exclude the nav bar. We can use a CSS selector for that:
! shot- scraper https:// fastai.github.io/ jupytercon- 2023 / -- output ../ posts/ images/ jupytercon- 2023 - tutorial.png -- selector '#quarto-content' -- width 800 -- height 450 -- retina
Ah, it doesn’t seem like --selector
works together with --width
and --height
. Another way to do this might be by hiding the navbar by executing --javascript
code:
! shot- scraper https:// fastai.github.io/ jupytercon- 2023 / -- output ../ posts/ images/ jupytercon- 2023 - tutorial.png -- width 800 -- height 450 -- retina -- javascript "document.querySelector('#quarto-header').style.display = 'none'"
Perfect! I’m chuffed with how easy this was. I typed this out exactly as I used it, and everything worked first time with zero errors. I think it would’ve been neat if I could use --width
and --height
to crop the image after a --selector
is applied, but in the end I could get what I wanted using a single line of --javascript
.