이 웹페이지에 링크된 모든 PDF 파일을 다운로드해야 합니다.https://www.in.tum.de/i07/lehre/ss22/theo/.
지금까지 시도한 모든 작업에서 파일을 얻지 못하거나 다운로드하지 못했습니다.모두재귀적으로 웹사이트를 방문하세요.
하지만 저는 이 페이지(웹사이트가 아님)에 직접 링크된 PDF에만 관심이 있습니다.
감사해요.
답변1
wget
( ) 및 ( ) 옵션을 사용하여 --no-parent
이 옵션으로 미러링되는 사이트의 양을 제어할 수 있습니다. ( ) 및 ( ) 옵션은 wget이 원격 디렉토리 구조를 복사하는 것을 방지합니다.
-np
--level=depth
-l
-r
--no-host-directories
-nH
--no-directories
-nd
(옵션이 전체 형식으로 작성된 경우 이중 하이픈이 옵션 앞에 오고, 옵션이 약식 형식으로 작성된 경우 단일 하이픈이 옵션 앞에 옵니다. --no-parent is -np)
예를 들어 다음과 같습니다.
wget -r -l 1 -nH -nd -np --ignore-case -A '*.pdf' https://www.in.tum.de/i07/lehre/ss22/theo/
기본적으로 현재 디렉터리에 .pdf 파일이 저장됩니다. 이 -P
옵션을 사용하여 다른 출력 디렉터리를 지정할 수 있습니다.
wget
매우 유연하고 옵션이 많습니다. 맨 페이지가 너무 많아서 처음 읽을 때 맨페이지가 부담스러울 수 있지만, 읽고 시도해 볼 가치가 있는 것은 분명합니다.
답변2
wget
이를 사용하거나 curl
다운로드하여 웹 페이지에서 PDF 파일 목록을 추출하고 xmlstarlet
결과 HTML/XML을 구문 분석할 수 있습니다.
curl https://www.in.tum.de/i07/lehre/ss22/theo/ |
xmlstarlet format -H index.html 2>/dev/null |
xmlstarlet select -t -m '//a[contains(@href,"pdf")]' -v '@href' -n
첫 번째는 xmlstarlet
HTML을 XML로 변환합니다. 두 번째는 모든 a
요소를 찾고 href
포함된 모든 속성 값을 추출합니다 pdf
.
거기에서 추출된 각 링크를 직접 다운로드할 수 있습니다. 이전 블록의 출력을 루프로 파이프합니다.
while IFS= read -r url
do
file="${url%\?*}" # Strip trailing ? parameters
file="${file##*/}" # Strip leading URL path
printf "Saving %s as %s\n" "$url" "$file" # Report action
curl "$url" >"$file"
done
답변3
더 광범위하게는 wget을 사용하여 웹 페이지에서 모든 PDF를 다운로드할 수 있습니다.
wget -r -l1 -H -t1 -nd -N -np -A.pdf -erobots=off --wait=2 --random-wait --limit-rate=20k [URL]
- -r: 재귀적 다운로드.
- -l1: 한 수준 깊이만(즉, 이 페이지에서 직접 링크된 파일만)
- -H: 교차 호스트(다른 호스트에 대한 링크를 따라감).
- -t1: 재시도 횟수는 1입니다.
- -nd: 디렉토리 구조를 생성하지 않고 모든 파일을 현재 디렉토리에 다운로드하기만 합니다.
- -N: 타임스탬프를 켭니다.
- -np: 상위 디렉토리에 대한 링크를 따르지 않습니다.
- -A.pdf: .pdf로 끝나는 파일만 허용됩니다.
- -erobots=off: robots.txt 파일을 무시합니다(주의해서 사용하고 사이트의 이용 약관을 존중합니다).
- --wait=2: 검색할 때마다 2초 동안 기다립니다.
- --random-wait: 0.5~1.5*의 대기 --wait 검색 간격(초)입니다.
- --limit-rate=20k: 다운로드 속도를 초당 20KB로 제한합니다.
이 매개변수는 "429: 요청이 너무 많습니다" 오류를 방지합니다.