Python script to download all images from a Pixieset gallery at the highest available resolution. Supports both public and password-protected galleries.
- Python 3.14+
- uv (package and virtual environment manager)
# 1. Clone or copy the project
cd pixieset-downloader
# 2. Install dependencies (creates the virtual environment automatically)
uv sync
# 3. Install the Chromium browser for Playwright
uv run playwright install chromiumuv run python downloader.py --url "https://example.pixieset.com/my-gallery/"uv run python downloader.py --url "https://example.pixieset.com/my-gallery/" --password "1234"| Argument | Required | Default | Description |
|---|---|---|---|
--url |
Yes | — | Pixieset gallery URL |
--password |
No | — | Gallery password (if protected) |
--output |
No | ./downloads |
Folder where images are saved |
--concurrent |
No | 5 |
Number of simultaneous downloads |
--dry-run |
No | — | List found image URLs without downloading |
# Download to a custom folder
uv run python downloader.py --url "https://example.pixieset.com/wedding/" --output ./wedding-photos
# Download with 10 simultaneous connections
uv run python downloader.py --url "https://example.pixieset.com/wedding/" --concurrent 10
# Preview URLs without downloading
uv run python downloader.py --url "https://example.pixieset.com/wedding/" --dry-run
# All options combined
uv run python downloader.py \
--url "https://example.pixieset.com/wedding/" \
--password "secret" \
--output ./wedding-photos \
--concurrent 8- Navigation — Opens the gallery in a headless Chromium browser using Playwright.
- Authentication — If
--passwordis provided, detects the password form and submits it automatically. - Image loading — Automatically scrolls to the bottom of the page to trigger lazy loading of all images.
- URL collection — Captures image URLs through three methods:
- Intercepting HTTP responses from the Pixieset CDN in real time.
- Extracting DOM attributes (
src,data-src,data-original,data-lazy,data-image,background-image). - Scanning inline scripts and embedded JSON data on the page.
- Resolution maximization — Pixieset uses size suffixes in its URLs (
-small,-medium,-large,-xlarge,-xxlarge). The script replaces any suffix with-xxlargeto get the highest resolution version. If the server responds with 403/404, it falls back to the original suffix. - Concurrent download — Downloads images in parallel using
aiohttpwith a semaphore to limit concurrency. Includes automatic retries with exponential backoff.
pixieset-downloader/
├── .venv/ # Virtual environment (created by uv)
├── pyproject.toml # Project definition and dependencies
├── downloader.py # Main script
└── README.md # This file
| Package | Purpose |
|---|---|
playwright |
Headless browser for rendering JS and scrolling |
aiohttp |
Concurrent and asynchronous HTTP downloads |
Both are installed automatically with uv sync.
- Verify the URL is correct and accessible from a regular browser.
- If the gallery requires a password, make sure to pass it with
--password. - Some galleries may have non-standard structures; try opening the URL in your browser and verify that images load.
- Increase concurrency if downloads are too slow:
--concurrent 10. - If you get many 403 errors, the server may be rate-limiting requests; reduce concurrency:
--concurrent 2.
Make sure you ran the browser installation step:
uv run playwright install chromiumThe downloaded images might still retain watermarks and potentially be of lower quality compared to the originals – which is good to support your local photographers!
This project is licensed under the MIT License.