(dear english-speaking friends, please use google translate)
Допустим мы хотим скачать свободный контент со страницы автоматически, а не нажимать вручную. Есть страница на которой указаны прямые ссылки. Однако именно нажимать нам на каждый неудобно. Это решение позволит взять все ссылки и аккуратно их скачать, контроллируя что скачаны будут именно они и то, что расход ресурсов будет минимальным.
Когда я указываю "аккуратно", я имею ввиду пониженная скорость, один поток, хорошая пауза между скачиваниями. В конечном итоге, так как мы будем себя вежливо вести, для владельца это даже лучше, чем ручное выкачивание, так как никогда на не придется чтото скачивать дважды по ошибке.
Если же вы будете вести себя неприлично - будьте уверены, что владелец быстро вас вычислит и отправит в бессрочный бан. Поэтому лучше не злоупотреблять.
Первым делом надо открыть искомую страницу и сохранить ее содержимое обычным броузером. К примеру как: page_source.txt
Теперь нужно вызвать "grep" по ссылкам. Чтобы оставить только релевантные линии.Вот примерный фрагмент:
<td><a href="/xxxxxxx/my_file.txt" onClick="rl(this, 'DM', 'list-http');return false;">http</a>
Самый надежный способ выудить строку - ключ "list-http".
Также заметьте, ссылки не абсолютные, а относительные. Значить к каждой строчке нужно будет еще добавить полный адрес.
Теперь правьте конструкцию снизу и вызвайте ее, чтобы получился список адресов:
grep "list-http" page_source.txt | sort | uniq | grep -o '<a .*href=.*>' | sed -e 's/<a/\n<a/g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d' | sed -e 's#^#http://ваш урл который надо спереди приписать.net#' > download_list.txt
Что это делает:
- вырезает все строки с ключевым словом из исходной страницы (page_code.txt)
- cортирует и унифицирует их
- вырезает оттуда конструкцию <a href>
- извлекает оттуда ссылку
- дополняет спереди до полного адреса
- помещает это в файл download_list.txt (с перезаписью)
Это создаст список файлов годных для скачки. Проверьте это.
Теперь осталось скормить это wget. Почему wget - потому что wget будет качать в один поток, один файл за раз, чтобы не бесить сервер. Самый "культурный" скачиватель.
Следующую строку нужно вызвать из места где распологается download_list.txt, туда и будут помешены скачанные файлы:
wget --user-agent="Mozilla/11.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2010092416 Firefox/11.0.0" --tries=3 -c -i download_list.txt -o download_log.log –limit-rate=500k --wait=5 --waitretry=30m
Что она делает:
Чем это удобнее, чем графический менеждер скачек?
Допустим мы хотим скачать свободный контент со страницы автоматически, а не нажимать вручную. Есть страница на которой указаны прямые ссылки. Однако именно нажимать нам на каждый неудобно. Это решение позволит взять все ссылки и аккуратно их скачать, контроллируя что скачаны будут именно они и то, что расход ресурсов будет минимальным.
Когда я указываю "аккуратно", я имею ввиду пониженная скорость, один поток, хорошая пауза между скачиваниями. В конечном итоге, так как мы будем себя вежливо вести, для владельца это даже лучше, чем ручное выкачивание, так как никогда на не придется чтото скачивать дважды по ошибке.
Если же вы будете вести себя неприлично - будьте уверены, что владелец быстро вас вычислит и отправит в бессрочный бан. Поэтому лучше не злоупотреблять.
Первым делом надо открыть искомую страницу и сохранить ее содержимое обычным броузером. К примеру как: page_source.txt
Теперь нужно вызвать "grep" по ссылкам. Чтобы оставить только релевантные линии.Вот примерный фрагмент:
<td><a href="/xxxxxxx/my_file.txt" onClick="rl(this, 'DM', 'list-http');return false;">http</a>
Самый надежный способ выудить строку - ключ "list-http".
Также заметьте, ссылки не абсолютные, а относительные. Значить к каждой строчке нужно будет еще добавить полный адрес.
Теперь правьте конструкцию снизу и вызвайте ее, чтобы получился список адресов:
grep "list-http" page_source.txt | sort | uniq | grep -o '<a .*href=.*>' | sed -e 's/<a/\n<a/g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d' | sed -e 's#^#http://ваш урл который надо спереди приписать.net#' > download_list.txt
Что это делает:
- вырезает все строки с ключевым словом из исходной страницы (page_code.txt)
- cортирует и унифицирует их
- вырезает оттуда конструкцию <a href>
- извлекает оттуда ссылку
- дополняет спереди до полного адреса
- помещает это в файл download_list.txt (с перезаписью)
Это создаст список файлов годных для скачки. Проверьте это.
Теперь осталось скормить это wget. Почему wget - потому что wget будет качать в один поток, один файл за раз, чтобы не бесить сервер. Самый "культурный" скачиватель.
Следующую строку нужно вызвать из места где распологается download_list.txt, туда и будут помешены скачанные файлы:
wget --user-agent="Mozilla/11.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2010092416 Firefox/11.0.0" --tries=3 -c -i download_list.txt -o download_log.log –limit-rate=500k --wait=5 --waitretry=30m
Что она делает:
- меняет useragent на более нейтральный
- ставит количество попыток перекачки на 3. В случае провала и частых попыток перекачать исходный сайт может нас банить (и правильно). Не будем бесить его:
- для того, чтобы не бесить, опция --waitretry ставит время ожидания при сбое в 30 минут. Это более чем гуманно.
- пишет лог. За ним можно следить с другой машины.
- ограничивает скорость 500 КиБ. Это нужно чтобы не перегружать целевой сервер.
- ставит ожидание между закачками в 10 секунд. Опять, чтобы также не перегружать сервер.
Чем это удобнее, чем графический менеждер скачек?
- полный контроль над точными ссылками
- потребляется значительно меньше системных ресурсов
- очень хорошая контроллируемость
- значительно более низкий риск сбоя при долговременной работе