I needed to archive several WordPress sites as part of the process of gathering the raw data for my thesis research. I found a few recipes online for using
wget to grab entire sites, but they all needed some tweaking. So, here’s my recipe for posterity:
I used wget, which is available on any linux-ish system (I ran it on the same Ubuntu server that hosts the sites).
wget --mirror -p --html-extension --convert-links -e robots=off -P . http://url-to-site
That command doesn’t throttle the requests, so it could cause problems if the server has high load. Here’s what that line does:
- --mirror: turns on recursion etc… rather than just downloading the single file at the root of the URL, it’ll now suck down the entire site.
- -p: download all prerequisites (supporting media etc…) rather than just the html
- --html-extension: this adds .html after the downloaded filename, to make sure it plays nicely on whatever system you’re going to view the archive on
- --convert-links: rewrite the URLs in the downloaded html files, to point to the downloaded files rather than to the live site. this makes it nice and portable, with everything living in a self-contained directory.
- -e robots=off: executes the “robots off” command, telling wget to ignore any directive to ignore the site in question. This is strictly Not a Good Thing To Do, but if you own the site, this is OK. If you don’t own the site being archived, you should obey all robots.txt files or you’ll be a Very Bad Person.
- -P .: set the download directory to something. I left it at the default “.” (which means “here”) but this is where you could pass in a directory path to tell wget to save the archived site. Handy, if you’re doing this on a regular basis (say, as a cron job or something…)
- http://url-to-site: this is the full URL of the site to download. You’ll likely want to change this.
You may also need to play around with the -D domain-list and/or --exclude-domains options, if you just want to control how it handles content hosted on more than one domain.
It’s worth noting that this isn’t WordPress-specific. This should work fine for archiving any website.