Я ищу путь к псевдопауку веб-сайт. Ключ - то, что я на самом деле не хочу содержание, а скорее простой список URIs. Я могу добраться обоснованно близко к этой идее с Wget с помощью --spider
опция, но при передаче по каналу того вывода через a grep
, Я, может казаться, не нахожу правильное волшебство заставить его работать:
wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'
grep
фильтр, кажется, не имеет абсолютно никакого влияния на wget
вывод. Я получил что-то не так или есть ли другой инструмент, который я должен попробовать, это более приспособлено к обеспечению этого вида ограниченного набора результатов?
ОБНОВЛЕНИЕ
Таким образом, я просто узнал офлайн это, по умолчанию, wget
записи к stderr. Я пропустил это в страницах справочника (на самом деле, я все еще не нашел его, если это там). После того как я передал возврат по каналу к stdout, я стал ближе к тому, в чем я нуждаюсь:
wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'
Я все еще интересовался бы другими/лучше средствами для того, чтобы сделать такого рода вещь, если кто-либо существует.
Абсолютное последнее , что я хочу сделать, это загрузить и проанализировать весь контент сам (т.е. создать своего собственного паука). Как только я узнал, что 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 стороннему инструменту для обработки в соответствии с моими потребностями.
Вывод по-прежнему необходимо немного оптимизировать (он производит дубликаты, как показано выше), но он почти готов, и мне не пришлось выполнять синтаксический анализ самостоятельно.
Создайте несколько регулярных выражений для извлечения адресов из всех
<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 - это unix-утилита Stream EDitor, которая позволяет выполнять операции фильтрации и преобразования.
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/
...