How to Download an Entire Webpage
Save one webpage for offline reading with browser tools, SingleFile, GNU Wget, or ScreenshotNeo—and understand what each method preserves.
To download one webpage for offline reading, use your browser’s built-in save command and choose the complete-page option. That saves the current HTML plus the images, stylesheets and other files needed to display it. Choose HTML only when you need just the markup, use SingleFile when you want one portable HTML archive, and use GNU Wget when you need a repeatable command-line workflow.
An entire webpage is one URL and its supporting assets. It is not the same as downloading an entire website. A site-wide copy follows links recursively and can retrieve far more content than you intended.
Choose the right method
| Method | Output | Best for | Main limitation |
|---|---|---|---|
| Browser: Web page, complete | HTML file plus an asset folder | Quick offline reading with images and styling | Files and links may be rewritten; interactive features may not work offline |
| Browser: HTML only | One HTML file | Markup, text or archiving the source structure | Pictures and other resources are omitted |
| SingleFile extension | One HTML file containing packaged resources | A portable file that is easy to move or email | Dynamic or server-dependent behavior may not reproduce perfectly |
| GNU Wget | Local HTML plus downloaded requisites | Scripts, automation and repeatable downloads | Authentication, JavaScript rendering and server rules can affect results |
| ScreenshotNeo | PNG, JPEG, WebP or PDF | A visual snapshot rather than an editable offline page | It captures the rendered result, not a browsable local website |
Save a webpage in a browser
Firefox
- Open the page you want to keep.
- Open the browser menu and select Save Page As.
- Choose a filename and destination.
- For images and styling, select Web page, complete. Firefox saves the HTML and a companion directory containing pictures and other required files.
- Choose Web page, HTML only when you want one markup file without pictures.
- Open the saved HTML file in a browser to read it offline.
Mozilla documents these choices in How to save a web page. Its text-file option saves readable text rather than the original link structure. The exact menu wording can vary by Firefox version and operating system.
Chrome and Chromium browsers
- Open the page.
- Use the browser menu’s save or download-page command.
- Pick a local folder and save the page.
- Open the saved file or the browser’s downloaded-pages view when offline.
Chrome’s help explains downloading pages in advance for offline reading: Download a page for offline reading. Menu labels and availability differ by platform and browser release, so consult the current help page if you do not see the command.
What the browser save contains
- Complete: the current document and resources the browser can save, commonly in a companion folder.
- HTML only: the document without images and other downloaded resources.
- Text: readable text without the original HTML structure.
A saved copy is for offline access. It is not guaranteed to preserve logins, forms, video playback, live data, comments, shopping carts or other server-dependent behavior.
Save the page as one HTML file with SingleFile
SingleFile is a browser extension for Chrome, Edge, Firefox and Safari that packages a webpage and resources such as images, stylesheets, fonts and frames into one HTML file. Install it from the browser’s official extension store, open the target page, then activate SingleFile and wait for the save to finish.
Use this when a companion asset directory is inconvenient. Treat the result as an archive of the rendered page: dynamic elements and features that require a server may not work after you disconnect.
Download one webpage with GNU Wget
GNU Wget can fetch one HTML page and the requisites referenced by its HTML and CSS. Leave out recursive and level options when you want one page rather than a site crawl. The GNU Wget 1.25.0 manual documents these behaviors and link conversion.
Basic command
wget --page-requisites --convert-links --adjust-extension --no-parent \
--directory-prefix=offline-page \
https://example.com/article
This creates an offline-page directory, downloads the page’s referenced assets, and converts links so the saved document can open locally. Replace the URL with the page you are allowed to download.
Keep the download scoped to one page
wget --page-requisites --convert-links --adjust-extension --no-parent \
--span-hosts=off \
--directory-prefix=offline-page \
https://example.com/article
Do not add --recursive or a broad depth value for this use case. Recursive options follow links and can turn a single-page save into a much larger crawl. Resources hosted on another origin may also be unavailable when cross-host downloading is disabled; decide whether those assets are necessary before changing scope.
Open the result
cd offline-page
# Open the generated HTML file in your browser.
# On systems with a command-line opener, for example:
xdg-open example.com/article.html
The generated filename depends on the URL and Wget version. List the directory and open the HTML file that Wget created.
Authenticated or private pages
Wget does not automatically reproduce a browser session. A page behind a login may require exported cookies, an authorization header or a different approved access method. Supplying credentials on a command line can expose secrets in shell history and process listings; use your operating system’s secret-management practices and follow the site’s access rules.
Why a saved page can look different offline
- JavaScript rendering: Wget downloads files; it does not guarantee the same JavaScript-rendered state you saw in a browser.
- Lazy loading: images or sections loaded only after scrolling may never be requested during the save.
- Cross-origin resources: fonts, images or scripts hosted elsewhere may be blocked, unavailable or subject to access controls.
- Server state: search, comments, accounts, payments and live feeds need a server connection.
- URL rewriting: complete-page saves and Wget convert links for local viewing, so the local structure may differ from the original.
- Media and embeds: video players, maps and third-party frames often depend on network requests.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Images are missing | You selected HTML only, or the image was lazy-loaded or blocked. | Use the complete option, scroll through the page first, or retry with Wget’s page-requisites mode. |
| CSS is missing | The stylesheet was not saved or its URL could not be fetched. | Save as complete, inspect the asset folder, and check network or access restrictions. |
| The file opens as a download instead of a page | The browser is treating the file type or location differently. | Open it from the browser’s File/Open command or drag the HTML file into a browser window. |
| Wget downloads too much | Recursive or broad link-following options were enabled. | Remove recursive options and keep the command limited to the target URL and its requisites. |
| Wget gets a bot-check or login page | The server returned a challenge or unauthenticated response. | Use an authorized browser save, provide approved session data, or capture the rendered page instead. |
| The offline page has broken links | Local rewriting cannot preserve every original URL or server route. | Use the saved copy for reading; keep the original URL for live navigation. |
| Interactive controls do nothing | The control needs JavaScript, a network request or account state. | Reconnect to the original site or save a visual snapshot of the state you need. |
Performance, reliability and storage
- Browser saves: usually require the least setup. Saving can take longer on pages with many assets or large images.
- SingleFile: simplifies moving one file, but the HTML can become large because resources are embedded.
- Wget: is repeatable and scriptable. Use a dedicated output directory, inspect the downloaded size, and avoid recursive flags unless you intentionally want a broader crawl.
- Reliability: preserve the original URL and capture date alongside the local copy. This helps distinguish a stale archive from a current page.
- Storage: complete saves and SingleFile archives include images, fonts and other assets. Clean up old copies or compress them when retention matters.
- Permissions: download only pages and resources you are permitted to copy, and respect site terms and applicable copyright rules.
Or skip the browser setup
For a visual copy in PNG, JPEG, WebP or PDF, ScreenshotNeo captures the rendered URL through one API request. It accepts the cookie or consent banner like a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets before the capture; each cleanup step can be turned off. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and the response identifies the result with X-Page-Verdict and X-Billed headers. Its MCP server provides take_screenshot, get_page_info and capture_pdf tools for Claude, Cursor and other MCP clients.
See the complete option reference in the ScreenshotNeo documentation.
cURL
curl -G "https://api.screenshotneo.com/v1/shot" \
-d access_key=YOUR_API_KEY \
--data-urlencode url=https://example.com/article \
-o shot.webp
Python
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com/article"},
timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({
access_key: 'YOUR_API_KEY',
url: 'https://example.com/article'
});
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const body = Buffer.from(await res.arrayBuffer());
require('fs').writeFileSync('shot.webp', body);
ScreenshotNeo includes full-page capture with lazy images loaded, element capture by CSS selector, dark mode, device presets, custom viewport and retina scale, PDF paper and margin controls, custom CSS and JavaScript, waits, request blocking, headers, cookies, user agents, authorization, timezone, geolocation, transparent backgrounds, resizing, selectable cache TTLs, signed links, asynchronous jobs, bulk capture for up to 100 URLs per call, a usage API and an OpenAPI specification. Existing parameter names used by other screenshot APIs also work, which can simplify migration.
Pricing is Free: 1,000 shots per month with no card; Starter: $5 for 3,000; Growth: $15 for 15,000; Pro: $39 for 60,000; Scale: $99 for 250,000; and Business: $249 for 1,000,000. Yearly billing gives two months free, and every feature is on every plan. Create a free ScreenshotNeo account and get 1,000 screenshots a month with no card.
FAQ
Does saving a webpage download every page on the site?
No. A normal page save retrieves the current document and resources needed to display it. Downloading linked pages requires a separate, broader crawl.
Which format is best for reading offline?
Use Web page, complete for a browser-readable copy with assets, or SingleFile for one portable HTML archive.
Why is HTML-only smaller but missing pictures?
HTML-only preserves the document markup without downloading the referenced images and other resources.
Can I edit the downloaded page?
You can edit the local HTML and assets, but server-backed behavior, authentication and live data will not become local automatically.
Should I use Wget for a JavaScript-heavy application?
Wget is useful for referenced files and repeatable downloads, but it does not promise the same fully rendered state as a browser. Use a browser save or a rendered screenshot when visual fidelity matters.


