From c51cf9738f0c46d063ea90e05897817d4148a7ae Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Wed, 15 Dec 2021 18:04:47 -0800 Subject: [PATCH] Update README --- README.md | 36 +++++++++++++----------------------- img/anki-thumb.png | Bin 4420 -> 0 bytes img/inspect-thumb.png | Bin 6162 -> 0 bytes 3 files changed, 13 insertions(+), 23 deletions(-) delete mode 100644 img/anki-thumb.png delete mode 100644 img/inspect-thumb.png diff --git a/README.md b/README.md index 21a5061..3943f2e 100644 --- a/README.md +++ b/README.md @@ -30,35 +30,26 @@ Otherwise, you can use the [pre-built binaries](https://github.com/FooSoft/scraw Executing Scrawl with the `-help` command line argument will trigger online help to be displayed. Below is a more detailed description of what the parameters do. -* **attr**: The attribute containing the desired download path is specified by this argument. -* **dir**: This argument specifies the output directory for downloaded files. -* **vebose**: Scrawl will output more details about what it is currently doing when this flag is set. +* `attr`: The attribute containing the desired download path is specified by this argument. +* `dir`: This argument specifies the output directory for downloaded files. +* `vebose`: Scrawl will output more details about what it is currently doing when this flag is set. ## Example Let's say we want to create a script to download the latest Debian package of [Anki](http://ankisrs.net/): -1. We load up the homepage and are presented with a big download button as shown in the screenshot below: - - [![Anki Homepage](img/anki-thumb.png)](img/anki.png) - -2. Let's copy that link so we can download the latest version with wGet or curl from our script at any time! - - Hmm, it looks like the path `http://ankisrs.net/download/mirror/anki-2.0.33.deb` has the version number embedded in - the filename. This means that even after a new version of Anki is released, our script will keep getting version +1. We load up the homepage and are presented with a big download button as shown in the screenshot below: \ + ![](img/anki.png) +2. Let's copy that link so we can download the latest version with wGet or curl from our script at any time! Hmm, it + looks like the path `http://ankisrs.net/download/mirror/anki-2.0.33.deb` has the version number embedded in the + filename. This means that even after a new version of Anki is released, our script will keep getting version `2.0.33` (unless of course it gets deleted). - -3. Let's inspect the download link in your favorite browser to see what additional information we can get: - - [![Inspector](img/inspect-thumb.png)](img/inspect.png) - -4. It appears that we can easily create a selector for this element: `#linux > a:nth-child(2)`. - - Note that [Chrome](https://www.google.com/chrome/) provides the option to copy the CSS selector for any element, - making knowledge of web technology optional for this step. - +3. Let's inspect the download link in your favorite browser to see what additional information we can get: \ + ![](img/inspect.png) +4. It appears that we can easily create a selector for this element: `#linux > a:nth-child(2)`. Note that + [Chrome](https://www.google.com/chrome/) provides the option to copy the CSS selector for any element, making + knowledge of web technology optional for this step. 5. Now let's create a simple download and install script: - ```bash #!/bin/sh rm -rf /tmp/anki @@ -67,7 +58,6 @@ Let's say we want to create a script to download the latest Debian package of [A sudo dpkg -i /tmp/anki/*.deb sudo apt-get install -y -f ``` - In this script, we prepare an empty download directory and tell Scrawl to scrape `http://ankisrs.net/`, extracting the `href` property of the download link identified by the CSS selector `#linux > a:nth-child(2)`. We then install the package and bring in any unsatisfied dependencies. diff --git a/img/anki-thumb.png b/img/anki-thumb.png deleted file mode 100644 index 0ca660a44882cb7ae899012b88e42414a2a2f05b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4420 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 KMNUMnLSTYuGm2~g diff --git a/img/inspect-thumb.png b/img/inspect-thumb.png deleted file mode 100644 index 6ea142db47c3a3206ee5c1ebc93fcdaf5ac516ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6162 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