Spider strony internetowej i zwraca tylko adresy URL

Szukam sposobu na pseudo-spider stronę internetową. Kluczem jest to, że tak naprawdę nie chcę zawartości, ale raczej prostej listy Uri. Można się do tego zbliżyć, używając Wget , używając opcji --spider, ale gdy przepuszczam wyjście przez grep, nie mogę znaleźć odpowiedniej magii, aby to zadziałało:

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

Filtr grep wydaje się nie mieć żadnego wpływu na wyjście wget. Czy mam coś nie tak, czy jest inne narzędzie, które powinienem wypróbować, to więcej nastawiony na zapewnienie tego rodzaju ograniczonego zestawu wyników?

UPDATE

Właśnie się dowiedziałem, że domyślnie wget pisze na stderr. Przegapiłem to na stronach podręcznika (w rzeczywistości nadal go nie znalazłem, jeśli tam jest). Jak już wrzuciłem return to stdout, zbliżyłem się do tego, czego potrzebuję:

wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'
Nadal byłbym zainteresowany innymi / lepszymi środkami do robienia tego typu rzeczy, jeśli takie istnieją.

4 answers

Absolutną ostatnią rzeczą, którą chcę zrobić, to pobrać i przeanalizować całą zawartość samodzielnie (tj. stworzyć własnego pająka). Kiedy dowiedziałem się, że Wget domyślnie zapisuje na stderr, byłem w stanie przekierować go na stdout i odpowiednio filtrować wyjście.

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

To daje mi listę zasobów zawartości (zasobów, które nie są obrazkami, plikami źródłowymi CSS lub JS) URI, które są spidered. Stamtąd mogę wysłać Uri do narzędzia innej firmy do przetwarzania, aby meed mój potrzeb.

Wyjście nadal musi być nieco usprawnione( produkuje duplikaty, jak pokazano powyżej), ale jest prawie na miejscu i nie musiałem robić żadnego parsowania osobiście.

 45
Author: Rob Wilkerson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-13 13:51:51

Utwórz kilka wyrażeń regularnych, aby wyodrębnić adresy ze wszystkich

<a href="(ADDRESS_IS_HERE)">.

Oto rozwiązanie, którego bym użył:

wget -q http://example.com -O - | \
    tr "\t\r\n'" '   "' | \
    grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
    sed -e 's/^.*"\([^"]\+\)".*$/\1/g'

Spowoduje to wyświetlenie wszystkich łączy http, https, ftp i ftps ze strony internetowej. Nie poda względnych adresów URL, tylko pełne adresy URL.

Wyjaśnienie dotyczące opcji używanych w serii poleceń piped:

Wget-q sprawia, że nie ma nadmiernej mocy wyjściowej (tryb cichy). wget - O-sprawia, że pobrany plik jest wyświetlany na stdout, a nie zapisany na dysk.

Tr jest uniksowym tłumaczem znaków, używanym w tym przykładzie do tłumaczenia nowych linii i tabulatorów na spacje, a także konwersji pojedynczych cudzysłowów na podwójne cudzysłowy, dzięki czemu możemy uprościć nasze wyrażenia regularne.

Grep-i sprawia, że wielkość wyszukiwania jest niewrażliwa grep-o sprawia, że wyświetla tylko pasujące porcje.

Sed jest uniksowym narzędziem Stream EDitor, które umożliwia filtrowanie i operacje transformacji.

Sed-e pozwala tylko nakarmić go ekspresja.

Uruchamianie tego małego skryptu na " http://craigslist.org " dość długa lista linków:

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/
...
 21
Author: Jay Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-10 17:12:05

Użyłem narzędzia o nazwie 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

Trochę hackish, ale przybliża Cię! To tylko pierwszy poziom. Wyobraź sobie pakowanie tego w skrypt samo rekurencyjny!

 6
Author: Rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-09 16:47:02

Zobacz to pytanie/odpowiedź na inny sposób, aby to zrobić za pomocą skryptu Pythona: Jak użyć modułu Scrapy Pythona, aby wyświetlić listę wszystkich adresów URL z mojej strony?

 2
Author: Adam F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:42