Паук веб-сайт и возврат URL только - PullRequest
57 голосов
/ 10 мая 2010

Я ищу способ псевдо-паука на сайте. Ключевым моментом является то, что я на самом деле не хочу контент, а просто простой список URI. Я могу достаточно близко подойти к этой идее с помощью Wget , используя опцию --spider, но при передаче этого вывода через grep я не могу найти правильную магию, чтобы она работала: 1005 *

wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'

Фильтр grep, похоже, абсолютно не влияет на вывод wget. У меня что-то не так или есть другой инструмент, который я должен попробовать, который больше ориентирован на предоставление такого ограниченного набора результатов?

UPDATE

Итак, в автономном режиме я обнаружил, что по умолчанию wget пишет в stderr. Я пропустил это на страницах руководства (фактически, я все еще не нашел это, если это там). Как только я отправил возврат в stdout, я приблизился к тому, что мне нужно:

wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'

Я бы по-прежнему интересовался другими / лучшими средствами для такого рода вещей, если таковые существуют.

Ответы [ 3 ]

47 голосов
/ 14 мая 2010

Абсолютная последняя вещь, которую я хочу сделать, это загрузить и проанализировать все содержимое самостоятельно (т.е. создать моего собственного паука). Как только я узнал, что 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

Это дает мне список URI ресурса контента (ресурсов, которые не являются изображениями, исходными файлами CSS или JS). Оттуда я могу отправить URI стороннему инструменту для обработки, чтобы удовлетворить мои потребности.

Вывод все еще нужно немного упростить (он производит дубликаты, как показано выше), но он почти у цели, и мне не пришлось ничего анализировать.

21 голосов
/ 10 мая 2010

Создайте несколько регулярных выражений для извлечения адресов из всех

<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 - делает так, чтобы загруженный файл выводился на стандартный вывод, а не сохранялся на диск.

tr - это переводчик символов Unix, используемый в этом примере для перевода символов новой строки и табуляции в пробелы, а также для преобразования одинарных кавычек в двойные, чтобы мы могли упростить наши регулярные выражения.

grep -i делает поиск нечувствительным к регистру grep -o выводит только совпадающие части.

sed - это утилита Stream EDitor Unix, которая позволяет выполнять операции фильтрации и преобразования.

sed -e просто позволяет вам выразить это выражение.

Запуск этого маленького скрипта на "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/
...
6 голосов
/ 09 мая 2013

Я использовал инструмент под названием 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

Немного хакерский, но приближает тебя! Это только первый уровень. Представьте себе, что вы упаковываете это в саморекурсивный сценарий!

...