How to take a screenshot of a webpage in Python?

Learn how to capture screenshots of webpages using Python with this straightforward guide. Discover essential techniques and tools to efficiently document your web scraping projects or debug issues.

Best practices

  • Ensure you have the latest version of Selenium and the appropriate WebDriver for your browser to avoid compatibility issues.

  • Use explicit waits or check conditions to ensure the webpage is fully loaded before taking a screenshot, as this prevents capturing incomplete page data.

  • Save screenshots in a lossless format like PNG to maintain image quality, especially if you need to analyze the webpage visually later.

  • Consider using headless mode for browsers when running your scripts on a server or for automated tasks to reduce resource consumption and improve performance.

# Import necessary libraries
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Set up Chrome WebDriver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# Open the target webpage
driver.get("https://sandbox.oxylabs.io/products")

# Take screenshot and save it
driver.save_screenshot('screenshot.png')

# Close the browser
driver.quit()

# Alternative method using PIL and io for in-memory screenshot
from PIL import Image
import io
from selenium.webdriver.common.by import By

# Set up and open webpage
driver = webdriver.Chrome(service=service)
driver.get("https://sandbox.oxylabs.io/products")

# Get screenshot as a binary data
screenshot = driver.get_screenshot_as_png()
image_stream = io.BytesIO(screenshot)
image = Image.open(image_stream)

# Save image file
image.save('screenshot_pil.png')

# Clean up
driver.quit()

Common issues

  • Ensure your script handles exceptions, such as `NoSuchElementException` when elements are not found during automation, to avoid crashes and improve reliability.

  • Regularly update the `webdriver-manager` package to ensure that the latest browser drivers are automatically managed and used in your projects.

  • When saving screenshots, verify the directory permissions and existence to prevent errors related to file writing operations.

  • Optimize the use of system resources by closing the browser with `driver.quit()` after operations are complete to prevent memory leaks and hanging processes.

# Incorrect: Not handling exceptions can cause the script to crash if elements are not found
driver.get("https://example.com")
element = driver.find_element(By.ID, "nonexistent-id")
element.click()

# Correct: Use try-except to handle NoSuchElementException
try:
element = driver.find_element(By.ID, "nonexistent-id")
element.click()
except NoSuchElementException:
print("Element not found")

# Incorrect: Using an outdated version of webdriver-manager might lead to compatibility issues
driver = webdriver.Chrome()

# Correct: Regularly update webdriver-manager to ensure compatibility
# This is typically handled outside the code, by updating the package via pip

# Incorrect: Saving a screenshot without checking if the directory exists
driver.save_screenshot('/nonexistent_directory/screenshot.png')

# Correct: Check if the directory exists and has write permissions before saving
import os
screenshot_path = '/valid_directory/screenshot.png'
if os.access(os.path.dirname(screenshot_path), os.W_OK):
driver.save_screenshot(screenshot_path)
else:
print("Directory not writable or does not exist")

# Incorrect: Not closing the browser can lead to memory leaks and hanging processes
driver.get("https://example.com")
# Missing driver.quit()

# Correct: Always close the browser with driver.quit() to free resources
driver.get("https://example.com")
driver.quit()

Try Oyxlabs' Proxies & Scraper API

Residential Proxies

Self-Service

Human-like scraping without IP blocking

From

8

Datacenter Proxies

Self-Service

Fast and reliable proxies for cost-efficient scraping

From

1.2

Web scraper API

Self-Service

Public data delivery from a majority of websites

From

49

Useful resources

Get the latest news from data gathering world

I'm interested