Как оптимизировать скрипт загрузки wget

Содержание сайта

<html> <body> <a href="http://www.sagar.com/" title="sagar">Sagar</a> <a href="http://www.sagarcom/1/" title="sagar1">Sagar Link1</a> <a href="http://www.sagar.com/2/song.mp3">Download this</a> </body> </html> 

link_source_file.txt содержит URL-адрес для вышеуказанного содержимого

 ## Below wget command wget -r -l1 -H -t1 -nd -N -np -A.mp3 -erobots=off -i link_source_file.txt 

Я хочу загрузить файл определенного типа, как указано -A. Вот это mp3 . Вышеупомянутая команда wget будет идти до одной глубины ссылки в соответствии с -t1 .

Он следует за первой ссылкой http://www.sagar.com/ и загружает файл index.html . Затем вычисляет, что не имеет никакого типа файла как .mp3 тогда он удаляет index.html

Я хочу, чтобы wget выполнял только ссылки, которые имеют расширение *.mp3 а не любые другие ссылки. Как я могу настроить команду для этого требования?

Я не думаю, что ты можешь. В конце концов, используя параметр рекурсивной загрузки -r основном запрашивается wget для поиска ссылок (на уровнях -l ), а ссылки встречаются только в html-файлах. Таким образом, wget, таким образом, необходимо загрузить и проанализировать html-файлы, ища ссылки на более html-файлы и mp3-файлы.

Если вы уже создали список ссылок, почему бы вам просто не использовать fgrep ".mp3" для создания нового списка только с mp3-файлами и использовать его как link_source_file для wget? Поскольку wget не будет загружать какие-либо html-файлы, он не найдет больше ссылок, поэтому вы можете удалить -r -l и, возможно, еще несколько других параметров – просто сохраните -i-A , хотя список уже содержит только просто файлы mp3). Используйте параметр -x чтобы принудительно создать иерархию файлов, даже без -r .

Короче говоря, если вы хотите рекурсивно перемещаться по сайту, вы должны разрешить wget загружать и анализировать html-файлы, даже если они не сохраняют их.


Альтернативой было бы использовать wget для загрузки всего нескольких уровней html-файлов. Затем соберите ссылки из этих файлов вручную и создайте список со всеми mp3-файлами, которые вы нашли (lynx, sed и fgrep могли бы помочь в этом). Или, если вы знаете что-то об организации сайта, сгенерируйте список файлов, которые вы хотите каким-либо другим способом (например, с помощью shellscript для создания списка с такими строками, как:

 http://www.sagar.com/1/song.mp3 http://www.sagar.com/2/song.mp3 http://www.sagar.com/3/song.mp3 http://www.sagar.com/100/song.mp3 

Ручной подход с grep.

Начните в пустой каталог и загрузите все HTML-файлы в своем списке нерекурсивно. Добавьте --convert-links , чтобы любые относительные ссылки на файлы MP3 были преобразованы в полные. Таким образом, у вас есть только такие файлы, как тот, который вы опубликовали выше, с одной или несколькими ссылками на файлы MP3.

Тогда вы можете сделать:

 (for f in * do grep -P --only-matching '(?<=href=")[^ "]*\.mp3' foo.html "$f" # rm "$f" done) | xargs wget 

Оставьте # перед rm если вы хотите удалить загруженные файлы без mp3.

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