Spider только для веб-сайтов и URL-адресов возврата
Я ищу способ для псевдо-паука веб-сайта. Ключ в том, что я действительно не хочу контент, а скорее простой список URI. Я могу приблизиться к этой идее с помощью Wget с помощью параметра --spider
, но когда трубопровод, который выводится через grep
, я похоже, не может найти правильную магию, чтобы заставить ее работать:
wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'
Фильтр grep
, по-видимому, абсолютно не влияет на вывод wget
. У меня что-то не так или есть другой инструмент, который я должен попробовать, чтобы больше ориентироваться на предоставление такого ограниченного набора результатов?
UPDATE
Итак, я просто обнаружил офлайн, что по умолчанию wget
пишет stderr. Я пропустил это на страницах руководства (на самом деле, я все еще не нашел его, если он там). Как только я вернул возвращение к стандарту, я приблизился к тому, что мне нужно:
wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'
Меня все равно интересовали другие/лучшие средства для такого рода вещей, если они существуют.
Ответы
Ответ 1
Абсолютное последнее, что я хочу сделать, это загрузить и разобрать весь контент сам (т.е. создать собственный паук). Как только я узнал, что Wget пишет stderr по умолчанию, я смог перенаправить его на stdout и соответствующим образом фильтровать выход.
wget --spider --force-html -r -l2 $url 2>&1 \
| grep '^--' | awk '{ print $3 }' \
| grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \
> urls.m3u
Это дает мне список ресурсов ресурса (ресурсов, которые не являются изображениями, исходными файлами CSS или JS) URI, которые рассматриваются. Оттуда я могу отправить URI на сторонний инструмент для обработки, чтобы удовлетворить мои потребности.
Выход по-прежнему нужно немного обтекать (он создает дубликаты, как показано выше), но он почти там, и мне не пришлось самостоятельно разбираться.
Ответ 2
Создайте несколько регулярных выражений, чтобы извлечь адреса из всех
<a href="(ADDRESS_IS_HERE)">.
Вот решение, которое я бы использовал:
wget -q http://example.com -O - | \
tr "\t\r\n'" ' "' | \
grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
sed -e 's/^.*"\([^"]\+\)".*$/\1/g'
Это приведет к удалению всех ссылок http, https, ftp и ftps с веб-страницы. Это не даст вам относительные URL-адреса, только полные URL-адреса.
Объяснение относительно параметров, используемых в серии команд с каналами:
wget -q не имеет избыточного выхода (тихий режим).
wget -O - делает это так, чтобы загруженный файл отражался на stdout, а не сохранялся на диске.
tr - это переводчик символов unix, используемый в этом примере для перевода строк и вкладок в пробелы, а также преобразования одинарных кавычек в двойные кавычки, чтобы мы могли упростить наши регулярные выражения.
grep -i делает поиск нечувствительным к регистру
grep -o выводит только соответствующие части.
sed - это утилита Stream EDitor unix, которая позволяет выполнять операции фильтрации и преобразования.
sed -e просто позволяет вам выражать свое выражение.
Запуск этого маленького script на " http://craigslist.org дал довольно длинный список ссылок:
http://blog.craigslist.org/
http://24hoursoncraigslist.com/subs/nowplaying.html
http://craigslistfoundation.org/
http://atlanta.craigslist.org/
http://austin.craigslist.org/
http://boston.craigslist.org/
http://chicago.craigslist.org/
http://cleveland.craigslist.org/
...
Ответ 3
Я использовал инструмент под названием xidel
xidel http://server -e '//a/@href' |
grep -v "http" |
sort -u |
xargs -L1 -I {} xidel http://server/{} -e '//a/@href' |
grep -v "http" | sort -u
Немного хаки, но приближает вас! Это только первый уровень. Представьте, что упакуйте это в саморекурсивный script!
Ответ 4
См. этот вопрос/ответ для другого способа сделать это с помощью python script: Как использовать модуль Python Scrapy для отображения всех URL-адресов с моего сайта?