Паук веб-сайт и возвращать только URL-адреса


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

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

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

обновление

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

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

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

4 51

4 ответа:

абсолютное последние что я хочу сделать, это загрузить и разобрать все содержания себя (т. е. создать свой собственный паук). Как только я узнал, что Wget пишет в stderr по умолчанию, я смог перенаправить его в stdout и соответствующим образом отфильтровать вывод.

wget --spider --force-html -r -l2 $url 2>&1 \
  | grep '^--' | awk '{ print  }' \
  | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \
  > urls.m3u

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

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

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

<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/^.*"\([^"]\+\)".*$//g'

это выведет все http, https, ftp и ftps ссылки с веб-страницы. Он не даст вам относительные URL-адреса, только полные URL-адреса.

объяснение параметров, используемых в серии конвейерных команд:

wget-q делает его не иметь чрезмерный выход (тихий режим). wget-O-делает так, чтобы загруженный файл выводится в stdout, а не сохранять на диск.

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

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

sed-это утилита 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/
...

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

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

см. этот вопрос / ответ для другого способа сделать это с помощью скрипта python:Как использовать модуль Python Scrapy для перечисления всех URL-адресов с моего сайта?