Подтвердить что ты не робот

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:'

Меня все равно интересовали другие/лучшие средства для такого рода вещей, если они существуют.

4b9b3361

Ответ 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!