보관된 웹사이트에서 모든 링크(다운로드 제외)를 추출하고 인쇄합니다.

보관된 웹사이트에서 모든 링크(다운로드 제외)를 추출하고 인쇄합니다.

보관된 웹사이트에서 모든 링크(다운로드 아님)를 추출하고 인쇄하고 싶습니다. 즉, www.foosite.com/archive 모든 폴더와 하위 폴더를 반복합니다.

www.foosite.com/archive 시나리오: 저는 다운로드 가능한 파일이 있는 디렉터리와 하위 디렉터리가 포함된 이와 같은 웹 아카이브에 있습니다 .

-man.pdf -.listing.txt |-Books/ |-my_book.pdf |-new_books.pdf |-Classics/ |-Songs |-annie's.song.mp3 |-summer.of.69.mp3 -robot.txt ................ 모든 디렉터리를 (재귀적으로) 반복하고 모든 (다운로드 가능한) 파일 경로(URL)를 가져옵니다. https://www.asite.com/man.pdf https://www.asite.com/read.txt https://www.asite.com/Books/my_book.pdf https://www.asite.com/Books/new_books.pdf https://www.asite.com/Classics/..... https://www.asite.com/Classics/........ https://www.asite.com/Songs/annie's.song.mp3 ....... https://www.asite.com/terms.txt ............................

그러나 간단한 웹 탐색 기술을 시뮬레이션하는 데 사용하려는 쉘 스크립트에서는 lynx출력이 무한 재귀에 갇히게 됩니다(문제는 구현 문제라기보다는 구문 문제에 더 가깝다고 생각하세요).

암호:

#!/bin/bash

links=`/usr/bin/lynx -dump -listonly -nonumbers $1`

function dump_primary_links() {

        for link in $links 
        do
            echo "$link" | grep -P "\/$" > /dev/null
            # if link ends with "/" that's a directory 

            if [  $? -eq 0  ]; then
                echo "primary link:$link"
                print_directory_items $link
                 # now recursively traverse the directory 
            else
                echo "$link" # else a normal link

            fi

        done


    }



function print_directory_items() {
    # get contents of directory 
    lst=`/usr/bin/lynx -dump -listonly -nonumbers $link`


     for lnk in $lst 
        do
            echo "$lnk" | grep -P "\/$" > /dev/null 
            # if there is a directory in $lst then travel directory recursively 

            if [  $? -eq 0  ]; then

                link=$lnk
                print_directory_items $link
            else
                echo "$lnk" # directory contents
            fi
       done

    }


get_link

알아채다:이 경우 Python(Requests 및 Beautifulsoup 또는 Scrapy)이 좋은 솔루션이 될 것이라는 것을 알고 있지만 간단한 UNIX 탐색 시뮬레이션 또는 "웹 디렉터리 탐색"을 원합니다.

답변1

미러 사이트를 사용할 수도 있지만 wget, 아무것도 다운로드하지 않도록 웹 스파이더 역할을 하도록 지정할 수도 있습니다.

따라서 이렇게 할 수 있지만 로그를 저장해야 합니다.

wget --no-directories --mirror --spider "$url" 2>&1 | tee "$log"

내 경우에는 로그에서 다음과 같은 내용을 발견했습니다.

Spider mode enabled. Check if remote file exists.
--2017-12-19 07:19:23--  URL

grep그런 다음 URL을 검색하는 데 사용합니다 .

grep -P -o -e '(?<=^--....-..-.. ..:..:..--  )(.*)' "$log"

예:

$ wget --no-directories --mirror --spider https://utw.me/file/scripts/ 2>&1 | tee log.txt
...
$ grep -P -o -e '(?<=^--....-..-.. ..:..:..--  )(.*)' log.txt
...
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2001.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2002.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2003.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2004.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2005.ass
...

답변2

내 생각엔 당신이 검색에 갇힌 것 같아요.https://www.asite.com/Books/(에서https://www.asite.com/) 그리고https://www.asite.com/(하위 디렉터리 중 하나에서).

wget, 다양한 조건에서 항목을 다운/가져오도록 curl선택할 lynx수 있습니다(초기 사이트를 떠나지 말고 최대 깊이는 X, ftp 사용 등).

추신.:

  • 전체 코드를 표시하지 않았습니다.
  • 인수를 사용하여 호출 print_directory_items하지만 가져오지 않습니다(로컬이라고 함 $1).
  • $( )백틱 보다 낫다

관련 정보