Tools for data hoarders

I’m glad to present you my new article. This article describes UNIX utilities I use to collect information about handheld computers. You will find here tips how to clone websites, download webpages, YouTube videos, Google books, files from SourceForge, etc. Other collectors may find this overview interesting and useful, so I decided to share. Please note that I run all the mentioned utilities in GNU/Linux. I’ve no information whether they support other operating systems (Windows, macOS).

Read full article

Инструменты коллекционера

Введение

Эта статья описывает UNIX-утилиты, которые я использую для сбора данных о карманных компьютерах с целью создания локального файлового архива. Информация об используемых утилитах может быть интересной и полезной для других коллекционеров, поэтому я решил поделиться ею. Хочу обратить внимание, что я успешно использую эти утилиты на GNU/Linux. Качество работы описанных утилит на других операционных системах (Windows, MacOS) мне неизвестно.

Стоит отметить, что автор статьи призывает соблюдать авторские права и правовые нормы используемых сетевых сервисов. Автор статьи не несёт ответственность за неправомерное использование приведённых ниже инструментов.

Зачем сохранять данные локально?

Есть множество причин почему данные на чужом хосте могут стать недоступны для вас в будущем:

  1. Весь удалённый сервер может стать недоуступен.
  2. Данные могут быть удалены с удалённого сервера.
  3. Может измениться политика предоставления данных удалённым сервером. Данные могут стать платными (например, по подписке) или недоступными в вашей стране в связи с политическими санкциями.

Скачивание обычных сайтов

Для скачивания множества страниц с одного сайта я использую wget. Эта утилита очень богата функционалом и предоставляет множетсво опций. Ниже приведены комбинации опций для типовых сценариев использования. Ограничения: указанная команда не скачивает динамически подгружаемый контент (который подгружается браузером, например, при прокрутке страницы).

Скачивание сайта целиком

Сценарий скачивания всего контента (всех ресурсов) сайта. Для использования нужно в двух местах заменить example.com на домен того сайта, который вы хотите скачать.

wget 
    --no-clobber 
    --mirror 
    --recursive 
    --convert-links 
    --backup-converted 
    --page-requisites 
    --span-hosts 
    --domains=example.com  
    --restrict-file-names=windows 
    http://example.com/

Скачивание иерархии ресурсов одного сайта

Сценарий скачивания подмножества ресурсов сайта, имеющих общую URI-иерархию в пути. Для использования нужно в двух местах заменить example.com на домен интересующего сайта, а path – на общую иерархическую часть URI.

wget 
    --no-clobber 
    --mirror 
    --recursive 
    --convert-links 
    --backup-converted 
    --page-requisites 
    --span-hosts 
    --domains=example.com 
    --restrict-file-names=windows 
    --no-parent 
    http://example.com/path/

Скачивание одной страницы

Для скачивания контента одной страницы я использую Firefox с дополнительными плагинами. Прежде всего – это два похожих расширения Save Page WE и SingleFile.
Скачать контент одной страницы можно и с использованием wget. Но указанные плагины удобны тем, что они скачивают в том числе динамически подгружаемый контент и сохраняют страницу со всем содержимым в виде одного html-файла. В таком виде страницы очень удобно хранить локально.
Два этих плагина решают задачу примерно одинаково. На некоторых сайтах лучше отрабатывает один плагин, на других сайтах – другой. Поэтому у меня установлены оба плагина. После каждого локального сохранения я рекомендую проверять результат и использовать второй плагин, если результат не устраивает.

Если стоит задача в дополнении к самой странице сохранить ещё и файлы, на которые ведут ссылки с этой страницы, то для этого хорошо подходит другой плагин Firefox – DownThemAll!. Плагин позволяет загрузить все файлы по ссылкам со страницы за один клик.

Как обойти ограничения хоста на скачивание ресурсов

Некоторые сайты имеют ограничения на скачивание ресурсов, которые будут препятствовать локальному сохранению контента. Я призываю уважать и соблюдать эти ограничения. Но в исключительных случаях вы под свою ответственность можете решить, что ограничение нужно обойти.

Ограничения могут быть активными или пассивными. К пассивным ограничениям можно отнести файл robots.txt, который достаточно просто проигнорировать.
Обойти активные ограничения немного сложнее. Для этого нужно использовать Tor и вводить случайные задержки между запросами. Для того, чтобы слать запросы через Tor можно использовать прокси-утилиту tsocks.

Итоговая командная строка, которая позволит обойти типичные ограничения на загрузку выглядит следующим образом:

tsocks wget  
    --no-clobber  
    --mirror  
    --recursive  
    --convert-links  
    --backup-converted  
    --page-requisites  
    --span-hosts  
    --domains=example.com  
    --restrict-file-names=windows  
    --waitretry=5  
    --wait=2  
    --random-wait  
    -e robots=off  
    http://example.com/ 

YouTube

Для загрузки видео с YouTube я использую популярную утилиту youtube-dl. Рекомендую при этом скачивать видео с лучшим качеством из доступных.

Пример использования:

youtube-dl -f bestvideo+bestaudio https://www.youtube.com/watch?v=ANW6X0DLT00

Wayback Machine

Цифровой архив Всемирной Паутины Wayback Machine на безвоздмездной основе предоставляет массу полезной информации о карманных компьютерах, которую больше порой нигде не найти. Сервис предоставляет API для разработки клиентских утилит. Если вы хотите загрузить локально, например, целый вебсайт (точнее все его ресурсы, которые есть в Wayback Machine), гораздо удобнее использовать специальные утилиты, чем Web-интерфейс самого сервиса.

Я использую утилиту wayback_machine_downloader. Она позволяет как загружать сайты целиком, так и отдельные типы файлов или директории с сайтов (см. опицию --only в документации).

Пример использования:

wayback_machine_downloader www.angstrom-distribution.org

Google books

Для скачивания книг и журналов с Google Books я использую GoBooDo (Google Books Downloader). Для того, чтобы эта утилита корректно работала, необходимо также установить tesseract.
На выходе утилита создаёт готовый pdf-файл и предоставляет снимки отдельных страниц.

Пример использования:

python GoBooDo.py --id HD0EAAAAMBAJ

Для скачивания я использую следующий конфигурационный файл settings.json:

{
    "country": "ru",
    "page_resolution": 1500,
    "tesseract_path": "/usr/bin/tesseract",
    "proxy_links": 0,
    "proxy_images": 0,
    "max_retry_links": 1,
    "max_retry_images": 1,
    "global_retry_time": 30
}

Клонирование репозиториев GitHub

Порой бывает нужно склонировать все github-репозитории одного пользователя. Эту задачу достаточно просто решить с помощью curl и jq. Для использования нужно заменить gemian на имя того пользователя, чьи репозитории вы хотите скачать. Если репозиториев у пользователя больше сотни, то скачивани нужно выполнять несколькими итерациями с инкрементом значения параметра page.

curl -s "https://api.github.com/users/gemian/repos?per_page=100&page=1" | jq -r ".[].git_url" | xargs -L1 git clone

Скачивание файлов проекта SourceForge

Для того, чтобы скачать все файлы из репозитория SourceForge я использую приведённый ниже скрипт. Это немного модифицированная версия из репозитория SpiritQuaddicted. Оригинальный скрипт у меня не работает.

#!/bin/sh
# Based on https://github.com/SpiritQuaddicted/sourceforge-file-download

set -e

display_usage() {
  echo "Downloads all of a SourceForge project's files."
  echo -e "\nUsage: ./sourceforge-file-download.sh [project name]\n"
}

if [ $# -eq 0 ]
then
  display_usage
  exit 1
fi

project=$1
echo "Downloading $project's files"

# download all the pages on which direct download links are
# be nice, sleep a second
wget -w 1 -np -m -A download https://sourceforge.net/projects/$project/files/

# extract those links
grep -Rh refresh sourceforge.net/ | grep -o "https[^\\?]*" | grep -v '&use_mirror=' > urllist

# remove temporary files, unless you want to keep them for some reason
rm -r sourceforge.net/

# download each of the extracted URLs, put into $projectname/
while read url; do wget --content-disposition -x -nH --cut-dirs=1 "${url}"; done < urllist

rm urllist

P.S.

В заключении я хочу поделиться несколькими мыслями по поводу сбора данных о карманных компьютерах.

  1. Рассмотрите возможность раздачи ваших локальных архивов материалов. Раздача материалов повышает вероятность того, что эта инфомация будет сохранена в будущем и не утеряна.
  2. Рассмотрите возможность содействия проекту Internet Archive. Выгрузка материалов в Internet Archive - это ещё один способ повысить вероятность сохранения информации в будущем.