브라우저없이 다운로드하기 Wget

2005. 1. 10. 16:59살아가는 이야기

브라우저없이 다운로드하기
By Adrian J Chung
한글번역 전정호
이 글은 한글번역판입니다. 원문은 여기에서 볼 수 있습니다.


--------------------------------------------------------------------------------


늦은 속도로 큰 파일을 받기위해 웹브라우저를 몇시간 혹은 몇일 동안 켜둔 적이 있는가? 한 웹페이지에 링크된 파일 40개를 다운로드하기위해 지루하게 하나하나 클릭한 적이 있는가? 다운로드가 끝나기도 전에 브라우저가 죽으면? GNU/Linux에는 브라우저없이 배경에서 다운로드하는 여러 도구가 있다. 이 도구를 사용하면 (다운로드가 끝나기 전에) 로그아웃할 수도 있고 끊어진 다운로드를 이을 수도 있으며 심지어 네트웍 사용량이 적을 때 다운받도록 할 수도 있다.

대화적인 방법이 불편할 때
웹브라우저는 웹을 클릭하여 몇초안에 내용을 보기 위한 (즉, 대화적인) 도구이다. 그러나 아무리 빨라도 몇초만에 다운로드할 수 없는 파일들이 많다. 예를 들어 GNU/Linux CD-ROM 배포본을 저장하는 ISO 이미지가 있다. 어떤 잘못 프로그램된 웹브라우저는 메모리를 낭비하고 갑자기 죽어서 오랜동안 사용하기에 적당치않다. 많은 브라우저가 있지만 여러 파일을 한번에 쉽게 다운로드할 수 있는 다중세션이나 (그래픽 편집 프로그램에서 영역을 선택하는 것과 같은) 선택기 기능이 있는 프라우저는 없다. 또한 파일을 모두 다운로드하기 전에 로그아웃할 수도 없다. 결정적으로 사무실에서 다운로드하면 대역폭을 공유하는 동료들을 화나게한다.

큰 파일을 다운받는데 적당한 도구들이 있다. 이 글은 GNU/Linux에 포함된 lynx, wget, at, crontab으로 파일 전송 문제를 해결하는 방법을 설명한다. 스크립트도 조금 사용할 것이므로, bash에 대해 조금 알면 도움이 될 것이다.

wget 도구
대부분 배포본은 다운로드 도구인 wget을 포함한다.


bash$ wget http://place.your.url/here
이 프로그램은 FTP나, 최근 수정된 파일 혹은 전체 웹사이트의 미러를 처리할 수 있다. (주의하지 않으면 전체 웹사이트 외에 링크된 사이트들도 다운로드할 것이다.) 웹사이트 미러(-m)는 다음과 같이 한다.


bash$ wget -m http://target.web.site/subdirectory
이 프로그램이 서버에 부하를 걸 수 있기 때문에 미러할 때는 "robots.txt" 규칙을 준수한다. 이 프로그램에는 정확히 어떤 파일을 미러할지, 따라갈 링크의 종류와 다운로드할 파일종류를 조정하는 옵션이 있다. 예를 들어 상대적인 링크만(-L)을 따라가며, GIF 이미지는 다운로드하지 않는다면(--reject=gif),


bash$ wget -m -L --reject=gif http://target.web.site/subdirectory
또한 wget는 다 받지않고 중단된 다운로드를 이을 수 있다. ("-c" 옵션) 단, 서버가 이어받기를 지원해야 한다.


bash$ wget -c http://the.url.of/incomplete/file
이어받기나 미러를 결합하여 (여러번 시도하여) 많은 파일이 있는 사이트를 완전히 미러할 수 있다. 어떻게 자동화하는지는 아래서 설명한다.

내 사무실과 같이 다운로드가 자주 끊어진다면 여러번 시도하도록 할 수 있다.


bash$ wget -t 5 http://place.your.url/here
위의 예는 5번 시도후에 포기한다. "-t inf"를 사용하면 포기하지 않는다.

프록시 방화벽을 사용한다면 어떻게하나? 환경변수 (대문자가 아니라 소문자로) http_proxy나 .wgetrc 설정파일로 사용할 프록시를 설정할 수 있다. 프록시된 연결의 문제점은 이어받기가 자주 실패할 수 있다는 점이다. 프록시 연결이 중단되면 프록시 서버는 파일의 일부만을 (전부 받았다고 생가하여) 캐쉬한다. 이어받기를 하기 위해 "wget -c"를 사용하면 프록시는 캐쉬를 보고 파일을 이미 다 받았다고 잘못된 보고를 한다. 특별한 헤더를 사용하여 대부분의 프록시가 캐쉬를 하지 않게 할 수 있다.


bash$ wget -c --header="Pragma: no-cache" http://place.your.url/here
"--header" 옵션으로 헤더를 추가하여 웹서버나 프록시의 행동을 수정할 수 있다. 어떤 사이트는 외부에서 링크된 파일을 다운로드할 수 없게 하고, 같은 사이트에서 링크된 파일만 다운로드할 수 있게 하는 경우가 있다. 이 경우 "Referer:" 헤더를 사용하여 해결할 수 있다.


bash$ wget --header="Referer: http://coming.from.this/page" http://surfing.to.this/page
어떤 나쁜 웹사이트는 특정 브라우저에서만 접속할 수 있다. 이 경우 "User-Agent:" 헤더를 사용하여 해결할 수 있다.


bash$ wget --header="User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)" http://msie.only.url/here
(주의: 위의 팁은 내용의 라이센스를 어기는 것으로 고려될 수 있으며 이를 불법으로 규정하는 나쁜 법들이 있다. 지역마다 다르니 확인해봐라.)

언제 다운로드하지? (at)
스트리밍 동영상이 느려지는 것을 좋아하지 않는 동료와 연결을 공유하는 사무실에서 큰 파일을 다운로드한다면 사람들이 사용하지 않는 시간에 다운로드하는 것을 고려해볼 수 있다. 모두가 떠난 후에도 사무실을 지키거나 저녁식사후 원격접속할 필요는 없다. 작업 스케줄러 at을 사용하면 된다.


bash$ at 2300
warning: commands will be executed using /bin/sh
at> wget http://place.your.url/here
at> press Ctrl-D
이제 오루 11시에(2300) 다운로드가 시작된다. 스케줄러 데몬인 atd가 실행되고 있는지 확인해라.

다운로드가 몇일이 걸린다면?
여러 큰 파일을 다운로드받아야 하고 네트웍이 비둘기 전령사 수준이라면, 아침에 사무실에 도착할때까지 다운로드가 안끝날 수 있다. 좋은 이웃이 되기위해 작업을 중단하고 다른 at 작업으로 다받을 때까지 몇일이고 이어받기를 한다. (이번에는 "wget -c") 이 과정을 crontab으로 자동화할 수 있다. 다음 내용을 포함하는 "crontab.txt"란 파일을 만든다.


0 23 * * 1-5 wget -c -N http://place.your.url/here 0 6 * * 1-5 killall wget
이는 특정 시간 간격으로 작업을 지시하는 crontab 파일이다. 처음 5 항목은 언제 명령어를 실행할지를 지시하고, 나머지는 무엇을 실행할지를 지시한다. 처음 두 항목은 하루중 시간을 지칭한다. 그래서 wget은 오후 11시 0분, killall wget은 오전 6시 0분에 실행된다. 세번째와 네번째 항목인 *은 어떤 달의 어떤 날도 가능하다는 뜻이다. 다섯번째 항목은 작업을 수행할 요일을 지시한다. "1-5"는 월요일에서 토요일까지를 의미한다.

그래서 주중의 오후 11시에 다운로드를 시작하고, 오전 6시에 중단한다. 이제 다음 명령어를 실행하여 스케줄에 따라 명령이 실행되게 하자.


bash$ crontab crontab.txt
wget의 "-N" 옵션은 다운받기 전에 대상 파일의 수정 시간을 검사하여, 파일을 다받았다면 다운로드를 하지 않는다. 그래서 이 옵션은 아무 문제없이 사용할 수 있다. "crontab -r"은 스케줄을 제거한다. 나는 이 방법으로 많은 ISO 파일을 여럿이 사용하는 전화선으로 받았다.

동적으로 생성한 웹페이지
어떤 웹페이지는 내용이 하루에도 여러번 바뀌기 때문에 요청할 때마다 생성된다. 대상이 기술적으로 파일이 아니라면 (즉 그때그때 생성되는 내용이라면), 파일 길이가 없고 이어받기는 의미가 없다. "-c" 옵션은 제대로 동작하지 않는다. 예를 들어 Linux Weekend News에서는 PHP로 페이지를 만든다.


bash$ wget http://lwn.net/bigpage.php3
다운로드가 중단되어 이어받기를 하면 처음부터 다시 받는다. 나의 경우 사무실의 연결이 자주 바빠지기 때문에 동적으로 생성된 HTML 파일이 다 받아졌는지 확인하는 스크립트를 작성했다.


#!/bin/bash # 파일이 없으면 만든다 touch bigpage.php3 \r
# 다 받았는지 검사 while ! grep -qi '' bigpage.php3 do rm -f bigpage.php3 \r
# LWN을 한 페이지로 다운로드 wget http://lwn.net/bigpage.php3 done


위의 bash 스크립트는 문서에서 HTML 파일 끝을 나타내는 ""이 발견될 때까지 문서를 다운로드한다.

SSL과 쿠키(cookie)
"https://"로 시작하는 URL은 SSL(Secure Sockets Layer, 전송을 암호화한다)을 통해 접근한다. 이 경우 curl이라는 다른 다운로드 도구를 사용할 수 있다.

어떤 웹사이트는 내용을 전송하기 전에 쿠기를 전송한다. 이 경우 웹브라우저의 쿠키파일에서 적절한 정보를 "Cookie:" 헤더에 추가해야 한다. lynx와 Mozilla 쿠키파일 형식으로는, (이미 브라우저로 이 사이트에 등록한 경우)


bash$ cookie=$( grep nytimes ~/.lynx_cookies |awk '{printf("%s=%s;",$6,$7)}' )
으로 http://www.nytimes.com에서 다운로드할 때 사용할 쿠키를 얻을 수 있다. w3m의 쿠키파일은 형식이 조금 다르다.


bash$ cookie=$( grep nytimes ~/.w3m/cookie |awk '{printf("%s=%s;",$2,$3)}' )
그런후 다운로드를 한다.


bash$ wget --header="Cookie: $cookie" http://www.nytimes.com/reuters/technology/tech-tech-supercomput.html
curl을 사용한다면,


bash$ curl -v -b $cookie -o supercomp.html http://www.nytimes.com/reuters/technology/tech-tech-supercomput.html
URL 목록 만들기
아직까지 한 파일 혹은 전체 웹사이트를 다운로드했다. 가끔 전체 사이트를 미러하지는 않지만 많은 파일을 다운로드해야 할 때가 있다. 예를 들어 100위까지 순서대로 음악파일을 포함하는 사이트에서 20위까지만 받을 때가 있다. 이 경우 "--accept"나 "--reject" 옵션은 파일들의 확장자가 동일하므로 사용할 수 없다. 대신 "lynx -dump"를 실행한다.


bash$ lynx -dump ftp://ftp.ssc.com/pub/lg/ |grep 'gz$' |tail -10 |awk '{print $2}' > urllist.txt
lynx의 출력을 GNU 문자처리 도구로 처리한다. 위의 예에서는 "gz"로 끝나는 URL을 뽑아서 마지막 10개만 저장한다. 간단한 bash 스크립트 명령어로 이 파일에 기록된 URL을 자동으로 다운로드할 수 있다.


bash$ for x in $(cat urllist.txt)
> do
> wget $x
> done

이제 우리는 Linux Gazette에서 최근 열개를 다운로드했다.

대역폭을 최대로
당신이 넢은 대역폭을 사용할 수 있는 선택받은 소수라면 다운로드 속도는 웹서버 부하에 결정된다. 그렇다면 파일 전송을 "빠르게하는" 편법이 있다. 먼저 curl과, 같은 파일을 미러하는 여러 웹사이트가 필요하다. 예를 들어 다음 3 곳에서 Mandrake 8.0 ISO를 다운받는다고 가정하자.


url1=http://ftp.eecs.umich.edu/pub/linux/mandrake/iso/Mandrake80-inst.iso \r
url2=http://ftp.rpmfind.net/linux/Mandrake/iso/Mandrake80-inst.iso \r
url3=http://ftp.wayne.edu/linux/mandrake/iso/Mandrake80-inst.iso \r
파일 크기는 677281792다. curl의 "--range" 옵션을 이용하여 동시에 다운로드한다.


bash$ curl -r 0-199999999 -o mdk-iso.part1 $url1 & \r
bash$ curl -r 200000000-399999999 -o mdk-iso.part2 $url2 & \r
bash$ curl -r 400000000- -o mdk-iso.part3 $url3 & \r
그러면 다른 서버에서 파일의 다른 부분을 다운로드를 하는 세 배경 프로세스가 생긴다. "-r" 옵션은 다운로드할 파일의 범위를 (바이트로) 지정한다. 다 마쳤으면 세 부분을 cat으로 간단히 합칠 수 있다. cat mdk-iso.part? > mdk-80.iso (CD-R을 굽기전에 md5를 확인하길 권한다.) 서로 다른 창에서 "--verbose" 옵션을 사용하여 curl을 실행하면 전송 과정을 보여준다.

결론
다운로드를 위해 비대화적인 방법을 사용하는 것을 두려워하지 마라. 웹 디자이너가 사이트를 대화적으로 서핑하도록 노력하였더라도 다운로드를 자동화하는 도구는 항상 있다.


Adrian J Chung
(케리비안해의) 트리니다드토바고의 West Indies 대학에서 학부생을 가르키지 않을 때면 Andrian은 웹메일 다운로드를 자동화하는 스크립트를 작성하고 직접 만든 그래픽 렌더러와 자료 시각화 라이브러리를 사용하여 다양한 스크립트 환경을 경험한다.
반응형

'살아가는 이야기' 카테고리의 다른 글

--;  (1) 2005.02.18
왕푸징 야시장~  (1) 2005.02.14
중국식당에서 음식물 섭취해 보아요~  (0) 2005.02.12
북경에도 눈이 왔다죠~  (1) 2005.02.08
무선마우스 가볍게 쓰기  (2) 2005.02.06
**1212 - *******  (1) 2004.12.12
크리스마스~  (3) 2004.12.10
우울하다...  (3) 2004.11.30
애플의 무선마우스  (8) 2004.11.03
얼마전에 구입한 CD들..  (2) 2004.11.03