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