Pinterest Downloader
Scrape a whole Pinterest board into ComfyUI, no browser, no key
- download_path
You want reference photos for a character sheet, training thumbnails, or a whole moodboard for a style transfer pass - and half of them live on some Pinterest board. This node is the boring, useful answer: paste a board URL, run the workflow, and every original-quality image on that board lands in ComfyUI/output/ while the node hands you the folder path. No browser session, no API key, no "download 12 pins at a time" clicking. It's one input, one output, and it does exactly one job - which is the right shape for a tool like this.
It sits in the image/download category, which is the data-gathering end of the graph. Most of what gets written about ComfyUI touches pixels - samplers, ControlNet, upscalers. This is the other 70%: plumbing that gets a directory of images into your workflow so the pixel-touching nodes have something to chew on. If you've ever hand-downloaded 40 references into a folder before generating, you already know the pain this removes.
How it actually works
Here's the part worth knowing: the node doesn't scrape Pinterest itself. It shells out to gallery-dl, the long-running open-source command-line downloader, via a subprocess call with a temporary JSON config that points it at ComfyUI's output directory and names files {pin_id}.{extension}. gallery-dl does the real work - it walks the board's pagination so you get all pins, not just the first page, and it handles Pinterest's rate limiting. When it's done, the node walks the folder to count files and total size, prints a summary to the console, and returns the absolute path.
One honest warning, because the README will mislead you for a minute: it promises a live image preview on the node and a progress bar showing "5/27". The shipped code doesn't do that. It runs gallery-dl with output captured silently and prints a couple of lines at the start and end. So when you run it and see nothing on the node except a finished state - that's not you doing it wrong, that's README drift. Check the console for the real status.
The inputs and outputs that matter
There's exactly one input and one output, so this is the whole list:
pinterest_url(STRING) - the board URL, likehttps://www.pinterest.com/username/board-name/. Needs to be a board, not a profile or a pin.download_path(STRING) - the absolute path to the new folder underComfyUI/output/pinterest/pinterest_<timestamp>_<id>/. Unique folder per run, so reruns won't overwrite.
The catch: download_path is a path, not images. Core ComfyUI has no "load every file in this folder" node, so you need one from a utility pack to pull the images into the graph - WAS Node Suite's "Load Image Batch" or ComfyUI-Custom-Scripts' "Load Images From Path" both do it. From there the tensors flow into your preprocessing, ControlNet, or training setup like any other image source.
Installing it
ComfyUI Manager is the easy path: search "comfyui-pinterest-downloader" and let it handle the rest. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/VicoErv/comfyui-pinterest-downloader
cd comfyui-pinterest-downloader
pip install -r requirements.txt
Then restart ComfyUI. The real dependency story is in requirements.txt: requests, Pillow, and - the one the README forgets to mention - gallery-dl, which is the whole engine. If you installed through a venv or the Windows portable build, double-check that the gallery-dl command is on the PATH of whatever Python environment ComfyUI actually launches; the node checks shutil.which("gallery-dl") and will throw "gallery-dl is not installed" if it can't find it, even though pip said everything was fine.
Gotchas
Private boards return nothing - the node has no cookie or login input, so if a board isn't public, you're out of luck (gallery-dl can handle cookies, but this wrapper doesn't pass any). Pinterest can also rate-limit you; wait a bit and rerun. And remember the download is synchronous - the queue is blocked while gallery-dl works, so a big board will freeze execution for a while. Fine for a dedicated gather pass; not something you want inside a real-time loop.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| pinterest_url | STRING | https://www.pinterest.com/username/board-name/ | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| download_path | STRING | — |