arkennemasis Web Shot (page -> picture, text, links)
Free page capture that gives you the words, not just the picture
- image
- page_text
- links
- title
- report
The name undersells it. ArkWebShot isn't a screenshot node with extras - it's a web-reading node that happens to also take a picture. It drives the Chrome or Edge already installed on your machine, captures the page, and hands back the readable text and the links alongside the image. No API key, no per-shot billing, nothing to sign up for. That's rare enough in this space to be worth leading with.
The job it's built for is the avatar pipeline's story hunt: read today's source pages, pull out the article text and headline links, and let the picking model choose. A plain screenshot can't do that - you can't feed a JPEG to a text picker. This node gives you the words and the links the picker needs and the picture the presenter stands in front of, all from one call.
How it works
url takes one URL per line, and here's the nice part: their text and links are concatenated, while the image comes from the first. Blank lines and lines starting with # are ignored, so a source can be commented out rather than deleted, and https:// is added when the scheme is missing. That's a small thing that saves you a class of "why did this 404" debugging.
The viewport defaults to 430×932 at scale 2.0 - an iPhone 15 Pro Max at retina density. That's deliberate: a phone viewport makes the site serve its mobile layout, and 2.0 keeps the headline legible when the shot sits behind a vertical video. mobile emulation is on by default, with a phone user-agent.
The mechanism that frames the story rather than the nav bar is scroll_to: a comma-separated list of CSS selectors tried in order - the first that exists is scrolled to, then scroll_adjust_top (500px by default) scrolls past it to land on the article title. The default selector list was arrived at against real pages, and you will occasionally need to tune it for a new publisher. wait_seconds (3) settles the page first, so you're not photographing a spinner.
Outputs: image, page_text (trimmed by text_limit, default 12000 chars - the article is near the front, the nav is what gets cut), links (headline-sized anchors, link_limit 60), title, and report.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install replicate httpx
Restart ComfyUI. It needs a real Chrome or Edge on the machine; browser defaults to auto, which takes Chrome if installed and Edge otherwise, and browser_path is the escape hatch when your browser lives somewhere unusual. No keys, no accounts.
Troubleshooting
- It photographs the nav bar:
scroll_tofound nothing, or the selector doesn't exist on that site. Edit the selector list or leave it blank to shoot the top. - A spinner in the shot: raise
wait_seconds. Too low and you capture the loading state. - One URL per line is the image source; multiple URLs give you text from all of them. If a page looks "missing," check whether it was a
#-commented line. - For the picture itself, the pack's other node, ArkScreenshotOne, is the paid option that blocks cookie banners and ads server-side - ArkWebShot is the free one for reading.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | The page to read. ONE PER LINE for several — their text and links are concatenated, and the image comes from the first. Blank lines and lines starting with # are ignored, so a source can be commented out rather than deleted. `https://` is added when the scheme is missing. | |
| width | INT | 43064–4096 | Viewport width in CSS pixels. 430 is an iPhone 15 Pro Max, which is what makes a site serve its phone layout. |
| height | INT | 93264–8192 | Viewport height. The capture is the viewport, so this is the output height. |
| scale | FLOAT | 2.00.5–4 | Device pixel ratio. 2.0 renders at retina density, so the headline stays legible behind a video. |
| wait_seconds | FLOAT | 3.00–60 | Settling time after load, before scrolling and the shutter. Too low and you photograph a spinner. |
| scroll_to | STRING | body > div.wp-site-blocks > header > div > div, article h1, main h1, h1 | CSS selectors tried IN ORDER; the first that exists is scrolled to. This is what puts the headline in frame instead of the nav bar. Leave blank to shoot the top. |
| scroll_adjust_top | INT | 500-4000–8000 | Pixels to scroll PAST the matched element. 500 with a site-header selector lands on the article title. |
| mobileopt | BOOLEAN | true | Emulate a phone. Sites that branch on the user-agent or on touch support need this for their mobile layout. |
| browseropt | COMBO | Which browser to drive. `auto` takes Chrome if it is installed and Edge otherwise. | |
| browser_pathopt | STRING | Full path to a browser executable, when it is somewhere this node does not look. | |
| user_agentopt | STRING | Override the user-agent. Blank uses a phone UA when `mobile` is on, and the browser's own otherwise. | |
| timeout_secondsopt | INT | 9010–600 | Hard limit. A hung browser fails here instead of stalling the queue silently. |
| text_limitopt | INT | 12000500–200000 | Characters of page text to keep. A whole site is mostly navigation; the article is near the front. |
| link_limitopt | INT | 600–500 | How many links to return. Links under 25 characters of anchor text are dropped as navigation, so what is left is mostly headlines. |
| refreshopt | COMBO | How often to actually go and look. 'when the inputs change' caches forever — right when the page is a fixed article. 'once a day' refetches on the first run of each new date — right for a front page you are mining for today's story. 'every run' refetches always, and re-runs EVERYTHING downstream of it, including any render. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| page_text | STRING | — |
| links | STRING | — |
| title | STRING | — |
| report | STRING | — |