2010-05-10 15 views
46

Szukam sposobu na pseudo-spider na stronie internetowej. Kluczowe jest to, że tak naprawdę nie chcę zawartości, ale raczej prostej listy URI. Mogę dostać dość blisko do tego pomysłu z Wget używając opcji --spider, ale gdy potokiem że wyjście poprzez grep, nie mogę wydawać się znaleźć właściwą magię, aby to działało:Spider a Website and Return URLs Only

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

Filtr grep wydaje nie mieć absolutnie żadnego wpływu na dane wyjściowe wget. Czy mam coś nie tak, czy jest jakieś inne narzędzie, które powinienem spróbować, które jest bardziej nastawione na dostarczanie tego rodzaju ograniczonego zestawu wyników?

UPDATE

Więc po prostu okazało się, że w trybie offline, domyślnie wget pisze na stderr. Brakowało mi tego na stronach man (w rzeczywistości nadal nie znalazłem go, jeśli jest tam). Raz rurami powrót do stdout, mam bliżej do czego potrzebuję:

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

bym nadal być zainteresowany w innych/lepszych środków do prowadzenia tego typu rzeczy, jeśli w ogóle istnieje.

+0

Zobacz to pytanie/odpowiedź, aby uzyskać inny sposób, używając skryptu python: http://stackoverflow.com/questions/9561020/how-do-i--using-the-python-scrapy-module-to-list-all- URL-y z mojej strony internetowej –

+0

możliwy duplikat [Uzyskaj listę adresów URL z witryny] (http://stackoverflow.com/questions/857653/get-a-list-of-urls-froma-a- strona) –

Odpowiedz

39

Bezwzględna ostatni co chcę zrobić, to pobrać i analizować całą zawartość ja (tj tworzę własny pająk). Kiedy dowiedziałem się, że Wget zapisuje domyślnie na stderr, mogłem przekierować go na standardowe wyjście i odpowiednio przefiltrować wynik.

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ą obrazy, CSS lub JS pliki źródłowe) URI, które są spidered. Stamtąd mogę wysłać identyfikatory URI do narzędzia innej firmy do przetwarzania w celu zaspokojenia moich potrzeb.

Dane wyjściowe muszą być nieco uproszczone (duplikaty są takie, jak pokazano powyżej), ale są prawie na miejscu i nie musiałem sam wykonywać żadnych analiz.

+3

'wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s 2> & 1 | grep -Eio http. + Mp3' był dla mnie dobrym biletem magicznym Dziękuję! – AKX

+2

Zwykle przekazuję to wyjście do 'sort | uniq', aby usunąć duplikaty, FYI –

+1

Wiem, że minęło 5 lat od tej odpowiedzi ale czy możesz przyspieszyć proces? Zajmuje to kilka sekund lub minut dla witryn z 200 adresami URL – erdomester

19

Tworzenie kilka wyrażeń regularnych aby wyodrębnić adresy z całej

<a href="(ADDRESS_IS_HERE)">. 

Oto rozwiązanie użyłbym:

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

To wszystko HTTP, HTTPS, FTP i FTPS linki ze strony internetowej. Nie zapewni ci względnych adresów URL, tylko pełne adresy URL.

Wyjaśnienie dotyczące stosowanych w serii rurami poleceń opcji:

wget -q sprawia, że ​​nie ma za dużej mocy (tryb cichy). wget-O - sprawia, że ​​pobrany plik jest wysyłany do standardowego wyjścia, zamiast zapisywany na dysku.

tr jest tłumaczem znaków uniksowych, używanym w tym przykładzie do tłumaczenia znaków nowej linii i tabulatorów na spacje, a także przekształcania pojedynczych cudzysłowów w cudzysłowy, aby uprościć nasze wyrażenia regularne.

grep -i powoduje, że wyszukiwarka nie uwzględnia wielkości liter grep -o powoduje, że wyprowadzane są tylko pasujące części.

sed jest narzędziem uniksowym Stream EDitor, które umożliwia filtrowanie i przekształcanie.

sed -e po prostu pozwala ci nakarmić to wyrażenie.

Running ten mały skrypt na „http://craigslist.org” przyniosły całkiem długą listę 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/ 
... 
+2

+1 za przetestowanie twojego rozwiązania :) – BenV

+0

fajnie: D .. szukał właśnie tego! – Tathagata

+0

Bardzo fajnie. Ale wersje Win32 narzędzi dławią się ... Gdzieś. Czy możesz powiedzieć, jak je zmodyfikować dla Cygwin lub prostego systemu Windows? – Snowy

5

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 dostaje się bliżej! To tylko pierwszy poziom. Wyobraź sobie, że pakujesz to w skrypt rekurencyjny!

+0

Dzięki ... wygląda idealnie na skryptowanie obejścia problemu mojego wget (http://opendata.stackexchange.com/q/4851/ 263) – Joe