2010-05-10 7 views
46

나는 pseudo-spider 웹 사이트로가는 길을 찾고 있습니다. 핵심은 내가 실제로 콘텐츠를 원하는 것이 아니라 단순한 URI 목록입니다.웹 사이트를 거미로 URL을 반송

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

grep 필터 보인다 : 나는 Wget--spider 옵션을 사용하지만, grep를 통해 출력하는 배관 때, 나는 그것이 작동 할 수있는 권한 마법을 찾을 수 없습니다로이 아이디어 합리적으로 가까이 갈 수 있습니다 wget 출력에 전혀 영향을 미치지 않습니다. 내가 잘못한 것이 있거나 제한된 결과 집합을 제공하는 것보다 더 노력해야하는 다른 도구가 있습니까?

UPDATE

그래서 난 그냥 기본적으로 wget가 표준 오류에 기록, 오프라인을 발견했다. 나는 man 페이지에서 그것을 놓쳤다. (사실, 아직 거기에 있다면 그것을 찾지 못했다). 하나라도 해당되면

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

난 아직도, 이런 종류의 작업을 수행하는 다른/더 나은 수단에 관심이있을 것 : 나는 표준 출력으로 리턴 파이프하면, 내가 필요한 가까이 있어요.

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 링크 :

+0

파이썬 스크립트를 사용하여 다른 방법으로이 질문/답변보기 : http://stackoverflow.com/questions/9561020/how-do-i-use-the-python-scrapy-module-to-list-all- the-urls-from-my-website –

+0

가능한 중복 [사이트에서 URL 목록 가져 오기] (http://stackoverflow.com/questions/857653/get-a-list-of-urls-from-a- 사이트) –

답변

39

내가하고 싶은 절대 마지막 일이 다운로드하고 콘텐츠를 자신의 모든 구문 분석을 (만들 즉 내 자신의 거미). 나는를 Wget 기본적으로 표준 오류에 기록 것을 알게되면, 나는 표준 출력을 리디렉션하고 적절하게 출력을 필터링 할 수 있었다.

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

이렇게하면 spidered되는 콘텐츠 리소스 (이미지, CSS 또는 JS 소스 파일이 아닌 리소스)의 목록을 얻을 수 있습니다. 거기에서부터 URI를 제 3 자 도구로 보내서 내 요구 사항을 처리 할 수 ​​있습니다.

출력물은 여전히 ​​약간의 유선형이되어야하지만 (위 그림과 같이 복제물이 생성됩니다.) 거의 출력되었으므로 직접 구문 분석 할 필요가 없습니다.

+3

'wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s – AKX

+2

나는 일반적으로 출력을'sort | uniq'에 전달하여 중복을 제거했습니다. 참고 –

+1

이 답변 이후 5 년이 지난 것을 알고 있습니다. 하지만 프로세스 속도를 높일 수 있습니까? 200 URL을 가진 사이트 초 또는 심지어 분 걸립니다 – erdomester

19

여기에 모든

<a href="(ADDRESS_IS_HERE)">. 

에서 주소를 추출하는 데 몇 정규 표현식을 생성 내가 사용하는 것이 해결책이다 웹 페이지에서. 상대 URL, 전체 URL 만 제공하지는 않습니다. 파이프로 연결된 일련의 명령에 사용되는 옵션에 대한

설명 :

wget을 -q는 과도한 출력 (자동 모드)가 없습니다 수 있습니다. wget -O - 다운로드 한 파일을 디스크에 저장하지 않고 stdout으로 출력합니다.

그럴 필요는 우리가 우리의 정규 표현식을 단순화 할 수 있도록 공간을 줄 바꿈과 탭을 번역뿐만 아니라 따옴표에 작은 따옴표를 변환하려면이 예에서 사용 된 유닉스 문자 번역기입니다.

그렙 -i는 검색 대소 문자 구별 그렙 -o 만이 출력 정합 부하게 만든다.

sed는 필터링 및 변환 작업을 허용하는 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/ 
... 
+2

해결책을 테스트하기위한 +1 :) – BenV

+0

cool : D .. 이걸 찾고 있었어! – Tathagata

+0

매우 근사합니다. 그러나 Win32 버전의 툴은 질식하고 있습니다 ... 어딘가에 있습니다. Cygwin이나 직선 Windows 용으로 수정하는 방법을 말할 수 있습니까? – Snowy

5

내가

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 xidel

라는 도구를 사용하지만 가까이를 얻을 수있어! 이것은 첫 번째 수준에 불과합니다. 이것을 자기 재귀 스크립트로 패킹한다고 상상해보십시오!

+0

고마워 ... 내 wget 문제 (http://opendata.stackexchange.com/q/4851/) 해결 방법을 스크립트에 대한 완벽하게 보입니다. 263) – Joe