Локальная копия статей хабра и хабропесочницы при помощи Linux+wget+for+seq в 3 строки

в 13:10, , рубрики: bash scripting, habrahabr.ru, linux, Ubuntu, wget, Алгоритмы, скрипты, метки: , , , ,

Доброго времени суток!

Я читаю habrahabr.ru уже давно, однако «шустрый» инет есть на работе, а вот дома больше времени идет на загрузку статей чем на чтение… Поскольку ноутбук на работе подключить есть куда было принято решение скачать статьи из захабренных и песочницы. Как сделать это в 3 консольные команды под катом

Итак ссылка на статью на захабренные статьи имеет вид:
habrahabr.ru/post/[номер статьи]/
в песочнице
habrahabr.ru/sandbox/[номер статьи]/
Смотрим сколько статей есть на хабре и в песочнице вводя указанный выше адрес. На момент написания статьи захабрено 147858 статей в песочнице 46231 статей (обратите внимание в песочнице далеко не все статьи доступны!).
Для скачивания мой любимый инструмент wget, команды man wget и ubuntu.ru подсказывают, что для скачивания странички нужно запускать: wget -c -p [адрес].
Ключ "-c" дает возможность автоматически продолжить прерванную закачку, а "-p" загрузит заодно и подвязку к странице (все изображения, таблицы стилей и т.п.). Используя возможности командной строки и изучив справку wget вопрос с загрузкой можно решить 2 путями:

Тут надо добавить, что автоматизировать процесс ввода диапазона 1-n можно при помощи команды seq
Вариант1.1
В папке вводим последовательно команды в консоль

for np in `seq 1 147858`; do echo "wget -c -p http://habrahabr.ru/post/$np/" >> dload; done
for np in `seq 1 46231`; do echo "wget -c -p http://habrahabr.ru/sandbox/$np/" >> dload; done
bash ./dload

Вариант 1.2

for np in `seq 1 147858`; do echo "http://habrahabr.ru/post/$np/" >> dload; done
for np in `seq 1 46231`; do echo "http://habrahabr.ru/sandbox/$np/" >> dload; done
wget -c -p -i dload

Совпадающие файлы не будут повторно закачены. Копия сайта ляжет в habrahabr.ru
Если нужно сделать ссылки на хабр локальными, добавляем ключ "-k" (ссылки будут обновляться последовательно т.е. из 100 поста на 50 будут, а вот из 50 на сотый — нет):

for np in `seq 1 147858`; do echo "wget -c -p -k http://habrahabr.ru/post/$np/" >> dload; done
for np in `seq 1 46231`; do echo "wget -c -p -k http://habrahabr.ru/sandbox/$np/" >> dload; done
bash ./dload

Вариант 1.2

for np in `seq 1 147858`; do echo "http://habrahabr.ru/post/$np/" >> dload; done
for np in `seq 1 46231`; do echo "http://habrahabr.ru/sandbox/$np/" >> dload; done
wget -c -p -i -k dload

Это все можно внести в bash-скрипт

#!/bin/bash
for np in `seq 1 147858`; do echo "http://habrahabr.ru/post/$np/" >> dload; done
for np in `seq 1 46231`; do echo "http://habrahabr.ru/sandbox/$np/" >> dload; done
wget -c -p -i -k dload

Для скачивания произвольного диапазона

#!/bin/bash
for np in `seq $1 $2`; do echo "http://habrahabr.ru/post/$np/" >> dload; done
for np in `seq $3 $4`; do echo "http://habrahabr.ru/sandbox/$np/" >> dload; done
wget -c -p -i -k dload

при этом в скрипт нужно передать 4 значения:
1. Начало интервала захабренные
2. Конец интервала захабренные (значение больше чем в п. 1)
3. Начало интервала песочница
4. Конец интервала песочница (значение больше чем в п. 3)

Надеюсь полезно. Удачи!

Автор: astrobeglec

* - обязательные к заполнению поля