VSCO Scraper
Pull an entire VSCO gallery into ComfyUI (black bars and all)
- images
- vsco_data
The name is honest: this node really does scrape a public VSCO profile and hand you the photos as a ComfyUI IMAGE tensor. No API key, no token, no paid endpoint - it opens a real Chrome window, watches the gallery scroll, and saves every image to disk before you ever touch it. If you've been copy-pasting screenshots of someone's feed into your workflow, this is the shortcut that makes that look silly.
Why would you bother? VSCO is where the film-look photographers live, and a photographer's public gallery is basically a pre-curated style dataset. Building a style LoRA? The KB's lora-training doc has a line worth repeating: dataset curation beats every knob. Scrape 30–100 images from a profile whose look you want, and you've skipped the source-hunting phase entirely. Same deal if you want a gallery as img2img source material or a reference set to eyeball while you prompt. Just be honest with yourself up front: this is a brand-new, niche pack. If you google it, you'll find the repo and little else - budget a little debugging time.
How it works
VSCO sits behind Cloudflare bot protection, so there's no clean public API to curl. The pack's answer: launch real Chrome with remote debugging on port 9222, connect to it with Playwright over the Chrome DevTools Protocol, and intercept network responses as the page scrolls. It auto-scrolls the gallery, clicks "Load more" if it's there, snags media items out of the vsco.co/api responses, and downloads the actual images. ComfyUI's asyncio event loop can't run Playwright's sync API, so the browser dance happens on a worker thread.
Downloaded files persist in output_dir, which is the smart part: on re-runs, if the cache already has enough images, Chrome never opens and the node just loads from disk.
The inputs that matter
- username (required) - the
@prefix is stripped for you, so@someoneandsomeoneboth work. - max_images -
0= all. Set it when you only want the first N, or when you want a faster first scrape. It also truncates the cache list, so it's a real limit, not a hint. - output_dir - where images land. Defaults to
%TEMP%/vsco-downloads/<username>. Point it somewhere stable; the cache is the whole reason second runs are instant. - include_videos and force_refresh - leave videos off unless you want them, and use
force_refreshonly when the cache is stale and you want a clean re-scrape.
Two outputs: images - a padded batch [B, H, W, C] - and vsco_data, a VSCO_SIZES bundle carrying the original (H, W) of every frame. The padding matters and it will surprise you: VSCO photos aren't uniform resolution, so the pack pads everything up to the batch maximum with black bars and remembers the true sizes. Feed that padded batch straight into a sampler and the bars are real pixels in your output. That's exactly why the pack ships the other two nodes - crop or select to get originals back.
Installing
In ComfyUI Manager, search "ComfyUI VSCO Scraper", or:
cd ComfyUI/custom_nodes
git clone https://github.com/liquid-night/comfyui-vsco-scraper
Then restart ComfyUI and do the actual dependency work - this pack needs a real browser:
pip install -r requirements.txt
playwright install chromium
You also need Google Chrome installed on the machine. If auto-detection misses it, set CHROME_EXE (there's also CHROME_PORT and CHROME_SOURCE_PROFILE, best documented in the README). No model downloads, no weights - just browser + Python, refreshingly lightweight.
Where people get burned
- First run wants you to do something. The pack opens Chrome and prints, in the ComfyUI console: "Open Chrome and navigate to https://vsco.co/<username>/gallery - scroll until photos appear, then return to ComfyUI." Do exactly that once; the session is cached in a temp Chrome profile.
- Windows kills your Chrome. Before connecting, the pack runs
taskkill /F /IM chrome.exe /T- that's every Chrome process on the machine. If you're mid-browsing, your session dies when the node first launches. Aggressive by design; save your tabs. - "Chrome didn't start - check CHROME_EXE." Custom installs, portable builds, non-standard paths: set the env var. On Linux it launches with
--no-sandboxand SwiftShader software GL, so don't expect speed, and a truly headless box may still fight you. - The black bars aren't a bug. If your downstream images come out letterboxed, you skipped the crop step. On the plus side, the node shows a real progress bar during downloads and caches its output while your inputs stay unchanged - change any input and it re-executes fresh.
It's a scraper in a world that increasingly hates scrapers, so treat it as a get-what-you-get tool: great when it works, and when it doesn't, the console messages are unusually helpful about what it wants from you.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| username | STRING | — | |
| output_diropt | STRING | Directory to save downloaded images. Defaults to system temp/vsco-downloads/<username>. | |
| max_imagesopt | INT | 00–10000 | Maximum number of images to load as output. 0 = all. |
| include_videosopt | BOOLEAN | false | — |
| force_refreshopt | BOOLEAN | false | Re-scrape even if images already exist on disk. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| vsco_data | VSCO_SIZES | — |