2015-03-09 04:48:27 +00:00
grab-site
===
2015-07-29 08:55:06 +00:00
grab-site is an easy preconfigured web crawler designed for backing up websites.
Give grab-site a URL and it will recursively crawl the site and write
2015-07-18 09:54:07 +00:00
[WARC files ](http://www.archiveteam.org/index.php?title=The_WARC_Ecosystem ).
2015-07-29 08:55:06 +00:00
Internally, grab-site uses [wpull ](https://github.com/chfoo/wpull ) for crawling.
2015-03-09 04:48:27 +00:00
2015-07-18 09:54:07 +00:00
grab-site gives you
2015-07-18 11:25:00 +00:00
* a dashboard with all of your crawls, showing which URLs are being
2015-07-18 09:54:07 +00:00
grabbed, how many URLs are left in the queue, and more.
* the ability to add ignore patterns when the crawl is already running.
This allows you to skip the crawling of junk URLs that would
otherwise prevent your crawl from ever finishing. See below.
2015-03-09 04:48:27 +00:00
2015-07-29 08:55:06 +00:00
* an extensively tested default ignore set ([global ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/global ))
2015-08-21 05:20:26 +00:00
as well as additional (optional) ignore sets for forums, reddit, etc.
2015-07-18 09:58:17 +00:00
2015-07-18 10:02:10 +00:00
* duplicate page detection: links are not followed on pages whose
2015-07-18 10:01:25 +00:00
content duplicates an already-seen page.
2015-07-27 07:59:57 +00:00
The URL queue is kept on disk instead of in memory. If you're really lucky,
grab-site will manage to crawl a site with ~10M pages.
2015-07-18 11:22:28 +00:00
![dashboard screenshot ](https://raw.githubusercontent.com/ludios/grab-site/master/images/dashboard.png )
2015-07-18 11:19:07 +00:00
2015-09-30 23:46:46 +00:00
Note: grab-site currently **does not work with Python 3.5** ; please use Python 3.4 instead.
2015-09-30 23:44:25 +00:00
2015-10-12 08:24:26 +00:00
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE - RUN doctoc TO UPDATE -->
**Contents**
- [Install on Ubuntu ](#install-on-ubuntu )
- [Install on OS X ](#install-on-os-x )
- [Upgrade an existing install ](#upgrade-an-existing-install )
- [Usage ](#usage )
2015-12-06 06:00:04 +00:00
- [`grab-site` options, ordered by importance ](#grab-site-options-ordered-by-importance )
2015-12-11 08:39:36 +00:00
- [Tips for specific websites ](#tips-for-specific-websites )
2015-10-12 08:24:26 +00:00
- [Changing ignores during the crawl ](#changing-ignores-during-the-crawl )
- [Inspecting the URL queue ](#inspecting-the-url-queue )
- [Stopping a crawl ](#stopping-a-crawl )
- [Advanced `gs-server` options ](#advanced-gs-server-options )
- [Viewing the content in your WARC archives ](#viewing-the-content-in-your-warc-archives )
- [Inspecting WARC files in the terminal ](#inspecting-warc-files-in-the-terminal )
- [Thanks ](#thanks )
- [Help ](#help )
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
2015-07-18 06:16:46 +00:00
2015-10-11 06:35:39 +00:00
2015-07-20 06:35:32 +00:00
Install on Ubuntu
2015-03-09 04:48:27 +00:00
---
2015-10-21 22:44:14 +00:00
On Ubuntu 14.04, 14.10, or 15.04:
2015-02-05 04:27:38 +00:00
2015-02-05 04:25:49 +00:00
```
2015-02-05 19:27:19 +00:00
sudo apt-get install --no-install-recommends git build-essential python3-dev python3-pip
2015-07-18 10:41:24 +00:00
pip3 install --user git+https://github.com/ludios/grab-site
2015-02-05 04:25:49 +00:00
```
2015-10-21 22:44:14 +00:00
On Ubuntu 15.10:
```
sudo apt-get install --no-install-recommends git build-essential python3.4 python3.4-dev python3-pip
python3.4 `which pip3` install --user git+https://github.com/ludios/grab-site
```
2015-07-20 07:50:49 +00:00
To avoid having to type out `~/.local/bin/` below, add this to your
`~/.bashrc` or `~/.zshrc` :
2015-07-20 07:25:06 +00:00
```
PATH="$PATH:$HOME/.local/bin"
```
2015-07-18 06:16:46 +00:00
2015-10-11 06:35:39 +00:00
2015-07-20 06:35:32 +00:00
Install on OS X
---
2015-10-18 04:36:21 +00:00
On OS X 10.10 or 10.11:
2015-07-20 06:35:32 +00:00
2015-07-20 07:50:49 +00:00
1. If xcode is not already installed, type `gcc` in Terminal; you will be
prompted to install the command-line developer tools. Click 'Install'.
2015-07-20 06:35:32 +00:00
2015-10-18 04:38:38 +00:00
2. If Python 3.4.x is not already installed (type `python3.4 -V` ),
install Python 3.4.3 using the installer from
https://www.python.org/downloads/release/python-343/
2015-07-20 06:35:32 +00:00
3. `pip3 install --user git+https://github.com/ludios/grab-site`
2015-07-20 07:50:49 +00:00
**Important usage note**: Use `~/Library/Python/3.4/bin/` instead of
`~/.local/bin/` for all instructions below!
2015-07-20 06:35:32 +00:00
2015-07-20 07:50:49 +00:00
To avoid having to type out `~/Library/Python/3.4/bin/` below,
add this to your `~/.bash_profile` (which may not exist yet):
2015-07-20 07:25:06 +00:00
```
PATH="$PATH:$HOME/Library/Python/3.4/bin"
```
2015-07-20 06:35:32 +00:00
2015-10-11 06:35:39 +00:00
2015-09-30 22:31:46 +00:00
Upgrade an existing install
---
2015-10-25 01:27:35 +00:00
2015-10-25 02:23:23 +00:00
To update to the latest grab-site, simply run the `pip3 install ...` step again.
2015-10-25 01:27:35 +00:00
On Ubuntu 14.04-15.04 or OS X:
2015-09-30 22:31:46 +00:00
```
pip3 install --user git+https://github.com/ludios/grab-site
```
2015-10-25 01:27:35 +00:00
On Ubuntu 15.10:
```
python3.4 `which pip3` install --user git+https://github.com/ludios/grab-site
```
2015-09-30 22:31:46 +00:00
To upgrade all of grab-site's dependencies, add the `--upgrade` option (not advised unless you are having problems).
2015-10-11 06:35:39 +00:00
2015-03-09 04:48:27 +00:00
Usage
---
2015-07-18 12:06:00 +00:00
First, start the dashboard with:
2015-07-18 12:09:51 +00:00
```
~/.local/bin/gs-server
```
2015-07-18 12:06:00 +00:00
and point your browser to http://127.0.0.1:29000/
Then, start as many crawls as you want with:
2015-02-05 04:27:38 +00:00
```
2015-07-18 10:41:24 +00:00
~/.local/bin/grab-site URL
2015-02-05 04:27:38 +00:00
```
2015-07-18 12:06:00 +00:00
Do this inside tmux unless they're very short crawls.
2015-07-28 14:21:28 +00:00
grab-site outputs WARCs, logs, and control files to a new subdirectory in the
directory from which you launched `grab-site` , referred to here as "DIR".
(Use `ls -lrt` to find it.)
2015-11-30 06:31:21 +00:00
warcprox users: [warcprox ](https://github.com/internetarchive/warcprox ) breaks the
dashboard's WebSocket; please make your browser skip the proxy for whichever
host/IP you're using to reach the dashboard.
2015-12-06 06:00:04 +00:00
### `grab-site` options, ordered by importance
2015-07-17 03:59:42 +00:00
2015-07-27 06:50:48 +00:00
Options can come before or after the URL.
2015-07-20 08:23:35 +00:00
2015-07-20 08:29:37 +00:00
* `--1` : grab just `URL` and its page requisites, without recursing.
2015-07-20 08:23:35 +00:00
2015-08-21 05:20:26 +00:00
* `--igsets=IGSET1,IGSET2` : use ignore sets `IGSET1` and `IGSET2` .
2015-07-20 08:23:35 +00:00
2015-07-27 13:28:49 +00:00
Ignore sets are used to avoid requesting junk URLs using a pre-made set of
regular expressions.
2015-07-20 08:23:35 +00:00
2015-08-21 05:20:26 +00:00
`forums` is a frequently-used ignore set for archiving forums.
2015-07-29 08:45:25 +00:00
See [the full list of available ignore sets ](https://github.com/ludios/grab-site/tree/master/libgrabsite/ignore_sets ).
2015-02-05 04:27:38 +00:00
2015-07-29 08:45:25 +00:00
The [global ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/global )
2015-07-20 08:29:37 +00:00
ignore set is implied and always enabled.
2015-07-20 08:25:33 +00:00
2015-07-28 14:01:28 +00:00
The ignore sets can be changed during the crawl by editing the `DIR/igsets` file.
2015-07-20 08:29:37 +00:00
* `--no-offsite-links` : avoid following links to a depth of 1 on other domains.
2015-03-09 05:06:44 +00:00
2015-07-20 08:29:37 +00:00
grab-site always grabs page requisites (e.g. inline images and stylesheets), even if
they are on other domains. By default, grab-site also grabs linked pages to a depth
of 1 on other domains. To turn off this behavior, use `--no-offsite-links` .
2015-02-05 19:31:50 +00:00
2015-07-20 08:29:37 +00:00
Using `--no-offsite-links` may prevent all kinds of useful images, video, audio, downloads,
etc from being grabbed, because these are often hosted on a CDN or subdomain, and
thus would otherwise not be included in the recursive crawl.
2015-03-09 05:06:44 +00:00
2015-08-12 05:39:16 +00:00
* `-i` / `--input-file` : Load list of URLs-to-grab from a local file or from a
URL; like `wget -i` . File must be a newline-delimited list of URLs.
Combine with `--1` to avoid a recursive crawl on each URL.
* `--igon` : Print all URLs being ignored to the terminal and dashboard. Can be
changed during the crawl by `touch` ing or `rm` ing the `DIR/igoff` file.
2015-08-21 08:28:27 +00:00
* `--no-video` : Skip the download of videos by both mime type and file extension.
Skipped videos are logged to `DIR/skipped_videos` . Can be
changed during the crawl by `touch` ing or `rm` ing the `DIR/video` file.
2015-08-12 05:39:16 +00:00
* `--no-sitemaps` : don't queue URLs from `sitemap.xml` at the root of the site.
2015-07-28 14:01:28 +00:00
2015-08-10 13:12:22 +00:00
* `--max-content-length=N` : Skip the download of any response that claims a
2015-09-02 19:15:00 +00:00
Content-Length larger than `N` . (default: -1, don't skip anything).
Skipped URLs are logged to `DIR/skipped_max_content_length` . Can be changed
during the crawl by editing the `DIR/max_content_length` file.
2015-08-10 13:12:22 +00:00
2015-09-30 22:16:56 +00:00
* `--no-dupespotter` : Disable dupespotter, a plugin that skips the extraction
of links from pages that look like duplicates of earlier pages. Disable this
for sites that are directory listings, because they frequently trigger false
positives.
2015-08-12 05:39:16 +00:00
* `--concurrency=N` : Use `N` connections to fetch in parallel (default: 2).
Can be changed during the crawl by editing the `DIR/concurrency` file.
2015-08-10 13:23:43 +00:00
2015-08-12 05:39:16 +00:00
* `--delay=N` : Wait `N` milliseconds (default: 0) between requests on each concurrent fetcher.
Can be a range like X-Y to use a random delay between X and Y. Can be changed during
the crawl by editing the `DIR/delay` file.
2015-08-12 05:24:09 +00:00
2015-08-21 07:47:12 +00:00
* `--warc-max-size=BYTES` : Try to limit each WARC file to around `BYTES` bytes
before rolling over to a new WARC file (default: 5368709120, which is 5GiB).
Note that the resulting WARC files may be drastically larger if there are very
large responses.
2015-07-27 06:50:48 +00:00
* `--level=N` : recurse `N` levels instead of `inf` levels.
* `--page-requisites-level=N` : recurse page requisites `N` levels instead of `5` levels.
2015-08-10 13:40:52 +00:00
* `--ua=STRING` : Send User-Agent: `STRING` instead of pretending to be Firefox on Windows.
2015-08-10 13:38:00 +00:00
2015-08-12 06:39:49 +00:00
* `--wpull-args=ARGS` : String containing additional arguments to pass to wpull;
2015-08-12 07:49:20 +00:00
see `~/.local/bin/wpull --help` . `ARGS` is split with `shlex.split` and individual
2015-08-12 06:39:49 +00:00
arguments can contain spaces if quoted, e.g.
`--wpull-args="--youtube-dl \"--youtube-dl-exe=/My Documents/youtube-dl\""`
2015-10-07 08:13:19 +00:00
Also useful: `--wpull-args=--no-skip-getaddrinfo` to respect `/etc/hosts` entries.
2015-07-27 06:50:48 +00:00
* `--help` : print help text.
2015-03-09 05:06:44 +00:00
2015-12-11 08:39:36 +00:00
### Tips for specific websites
#### Static websites; WordPress blogs
The defaults usually work fine.
2015-12-11 08:40:30 +00:00
#### Blogger / blogspot.com blogs
2015-12-11 08:39:36 +00:00
If you want to archive X.blogspot.com from outside the US, start the crawl on http://X.blogspot.com/ncr (ncr = no country redirect) to avoid getting redirected to another TLD. Note that /ncr sets an `NCR` cookie that expires after a few weeks.
Some blogspot.com blogs use "[Dynamic Views ](https://support.google.com/blogger/answer/1229061?hl=en )" themes that require JavaScript and serve absolutely no HTML content. In rare cases, you can get JavaScript-free pages by appending `?m=1` (e.g. http://happinessbeyondthought.blogspot.com/?m=1). Otherwise, you can archive parts of these blogs through Google Cache instead (e.g. https://webcache.googleusercontent.com/search?q=cache:http://blog.datomic.com/) or by using http://archive.is/ instead of grab-site. If neither of these options work, try [using grab-site with phantomjs ](https://github.com/ludios/grab-site/issues/55#issuecomment-162118702 ).
2015-12-11 08:40:30 +00:00
#### Tumblr blogs
2015-12-11 08:39:36 +00:00
2015-12-11 08:44:23 +00:00
Use [`--igsets=singletumblr` ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/singletumblr ) to avoid crawling the homepages of other tumblr blogs.
2015-12-11 08:39:36 +00:00
If you don't care about who liked or reblogged a post, add `\?from_c=` to the crawl's `ignores` .
Some tumblr blogs appear to require JavaScript, but they are actually just hiding the page content with CSS. You are still likely to get a complete crawl. (See the links in the page source for http://X.tumblr.com/archive).
2015-12-11 08:48:18 +00:00
#### Subreddits
Use [`--igsets=reddit` ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/reddit ).
When crawling a subreddit, you **must** get the casing of the subreddit right for the recursive crawl to work. For example,
```
grab-site https://www.reddit.com/r/Oculus/ --igsets=reddit
```
will crawl only a few pages instead of the entire subreddit. The correct casing is:
```
grab-site https://www.reddit.com/r/oculus/ --igsets=reddit
```
You can hover over the "Hot"/"New"/... links at the top of the page to see the correct casing.
2015-12-11 08:40:30 +00:00
#### Directory listings ("Index of ...")
2015-12-11 08:39:36 +00:00
Use `--no-dupespotter` to avoid triggering false positives on the duplicate page detector. Without it, the crawl may miss large parts of the directory tree.
2015-12-11 08:40:30 +00:00
#### Very large websites
2015-12-11 08:39:36 +00:00
Use `--no-offsite-links` to stay on the main website and avoid crawling linked pages on other domains.
2015-12-11 08:40:30 +00:00
#### Websites that are likely to ban you for crawling fast
2015-12-11 08:39:36 +00:00
Use `--concurrency=1 --delay=500-1500` .
2015-12-11 08:40:30 +00:00
#### MediaWiki sites with English language
2015-12-11 08:39:36 +00:00
2015-12-11 08:44:23 +00:00
Use [`--igsets=mediawiki` ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/mediawiki ). Note that this ignore set ignores old page revisions.
2015-12-11 08:39:36 +00:00
2015-12-11 08:40:30 +00:00
#### MediaWiki sites with non-English language
2015-12-11 08:39:36 +00:00
You will probably have to add ignores with translated `Special:*` URLs based on [ignore_sets/mediawiki ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/mediawiki ).
2015-12-11 08:40:30 +00:00
#### Forums
2015-12-11 08:39:36 +00:00
2015-12-11 08:44:23 +00:00
Forums require more manual intervention with ignore patterns. [`--igsets=forums` ](https://github.com/ludios/grab-site/blob/master/libgrabsite/ignore_sets/forums ) is often useful for non-SMF forums, but you will have to add other ignore patterns, including one to ignore individual-forum-post pages if there are too many posts to crawl. (Generally, crawling the thread pages is enough.)
2015-12-11 08:39:36 +00:00
2015-12-11 08:56:27 +00:00
#### Websites whose domains have just expired but are still up at the webhost
2015-12-11 08:54:09 +00:00
Use a [DNS History ](https://www.google.com/search?q=historical+OR+history+dns ) service to find the old IP address (the DNS "A" record) for the domain. Add a line to your `/etc/hosts` to point the domain to the old IP. Start a crawl with `--wpull-args=--no-skip-getaddrinfo` to make wpull use `/etc/hosts` .
2015-07-18 06:16:46 +00:00
2015-10-11 06:35:39 +00:00
2015-03-09 04:48:27 +00:00
Changing ignores during the crawl
---
2015-07-18 06:23:24 +00:00
While the crawl is running, you can edit `DIR/ignores` and `DIR/igsets` ; the
2015-07-30 23:36:12 +00:00
changes will be applied within a few seconds.
2015-02-05 04:59:28 +00:00
2015-07-18 06:23:24 +00:00
`DIR/igsets` is a comma-separated list of ignore sets to use.
2015-02-05 05:37:34 +00:00
2015-02-05 19:31:50 +00:00
`DIR/ignores` is a newline-separated list of [Python 3 regular expressions ](http://pythex.org/ )
to use in addition to the ignore sets.
2015-02-05 05:37:34 +00:00
2015-07-18 08:23:56 +00:00
You can `rm DIR/igoff` to display all URLs that are being filtered out
by the ignores, and `touch DIR/igoff` to turn it back off.
2015-07-18 06:16:46 +00:00
2015-10-11 06:35:39 +00:00
2015-07-28 11:33:51 +00:00
Inspecting the URL queue
---
Inspecting the URL queue is usually not necessary, but may be helpful
2015-07-31 03:50:39 +00:00
for adding ignores before grab-site crawls a large number of junk URLs.
2015-07-28 11:33:51 +00:00
2015-07-28 11:34:58 +00:00
To dump the queue, run:
2015-07-28 11:33:51 +00:00
```
~/.local/bin/gs-dump-urls DIR/wpull.db todo
```
Four other statuses can be used besides `todo` :
`done` , `error` , `in_progress` , and `skipped` .
2015-07-28 11:40:14 +00:00
You may want to pipe the output to `sort` and `less` :
```
~/.local/bin/gs-dump-urls DIR/wpull.db todo | sort | less -S
```
2015-07-28 11:33:51 +00:00
2015-10-11 06:35:39 +00:00
2015-07-18 10:51:17 +00:00
Stopping a crawl
---
You can `touch DIR/stop` or press ctrl-c, which will do the same. You will
have to wait for the current downloads to finish.
2015-10-11 06:35:39 +00:00
2015-07-18 12:06:00 +00:00
Advanced `gs-server` options
2015-07-18 06:16:46 +00:00
---
2015-07-18 12:06:00 +00:00
These environmental variables control what `gs-server` listens on:
2015-07-18 06:16:46 +00:00
2015-07-18 06:21:03 +00:00
* `GRAB_SITE_HTTP_INTERFACE` (default 0.0.0.0)
* `GRAB_SITE_HTTP_PORT` (default 29000)
* `GRAB_SITE_WS_INTERFACE` (default 0.0.0.0)
* `GRAB_SITE_WS_PORT` (default 29001)
2015-07-18 06:16:46 +00:00
2015-07-18 09:54:07 +00:00
`GRAB_SITE_WS_PORT` should be 1 port higher than `GRAB_SITE_HTTP_PORT` ,
2015-07-20 08:50:47 +00:00
or else you will have to add `?host=WS_HOST:WS_PORT` to your dashboard URL.
2015-07-18 06:16:46 +00:00
2015-07-18 06:22:47 +00:00
These environmental variables control which server each `grab-site` process connects to:
2015-07-18 06:16:46 +00:00
2015-07-18 06:21:03 +00:00
* `GRAB_SITE_WS_HOST` (default 127.0.0.1)
* `GRAB_SITE_WS_PORT` (default 29001)
2015-07-19 20:15:23 +00:00
2015-10-11 06:35:39 +00:00
2015-07-20 09:47:22 +00:00
Viewing the content in your WARC archives
---
You can use [ikreymer/webarchiveplayer ](https://github.com/ikreymer/webarchiveplayer )
to view the content inside your WARC archives. It requires Python 2, so install it with
`pip` instead of `pip3` :
```
sudo apt-get install --no-install-recommends git build-essential python-dev python-pip
pip install --user git+https://github.com/ikreymer/webarchiveplayer
```
And use it with:
```
~/.local/bin/webarchiveplayer < path to WARC >
```
then point your browser to http://127.0.0.1:8090/
2015-10-11 06:35:39 +00:00
Inspecting WARC files in the terminal
---
`zless` is a wrapper over `less` that can be used to view raw WARC content:
```
zless DIR/FILE.warc.gz
```
`zless -S` will turn off line wrapping.
Note that grab-site requests uncompressed HTTP responses to avoid double-compression in .warc.gz files and to make zless output more useful. However, some servers send compressed responses anyway.
2015-07-27 07:59:57 +00:00
Thanks
---
grab-site is made possible only because of [wpull ](https://github.com/chfoo/wpull ),
written by [Christopher Foo ](https://github.com/chfoo ) who spent a year
making something much better than wget. ArchiveTeam's most pressing
issue with wget at the time was that it kept the entire URL queue in memory
instead of on disk. wpull has many other advantages over wget, including
better link extraction and Python hooks.
2015-07-31 03:52:42 +00:00
Thanks to [David Yip ](https://github.com/yipdw ), who created
[ArchiveBot ](https://github.com/ArchiveTeam/ArchiveBot ). The wpull
2015-07-29 08:55:06 +00:00
hooks in ArchiveBot served as the basis for grab-site. The original ArchiveBot
dashboard inspired the newer dashboard now used in both projects.
2015-07-27 07:59:57 +00:00
2015-10-11 06:35:39 +00:00
2015-07-19 20:15:23 +00:00
Help
---
2015-07-20 09:53:13 +00:00
grab-site bugs, discussion, ideas are welcome in [grab-site/issues ](https://github.com/ludios/grab-site/issues ).
2015-07-27 08:52:48 +00:00
If you are affected by an existing issue, please +1 it.
2015-07-19 20:15:23 +00:00
2015-07-20 07:50:49 +00:00
If a problem happens when running just `~/.local/bin/wpull -r URL` (no grab-site),
you may want to report it to [wpull/issues ](https://github.com/chfoo/wpull/issues ) instead.