가끔 가는 어떤 게시판은... 게시판의 내부 검색 기능이 죽어버렸다.
그래서 그 게시판의 옛날 글들에서 뭔가 찾고 싶을때에는... 환장한다. (-_ㅡ );;
생각해보면, 간혹 어떤 게시판들은 내가 만족할만한 검색툴을 제공해주지 않아서 열을 받곤 한다.
그래서 오늘은 결국 수박이를 국톡으로 불러서 토론을 해가며 아래와 같은 말초적인 해결책을 만들어내기에 이른것이다.
wget과 배치파일. (참고로 GNU의 wget은 이런데 대충 찾으면 나옴...)
결국, 반복적인 숫자 바꿔치기 우아렐에서 내용을 가지고 와서 내 하드에 일일히 쌓아버리고... 탐색기에서 그 폴더에 검색을 걸어서 "이 텍스트를 포함하는 파일 찾기"로 찾아버리겠다는 똥꼬!!
일단, wget을 받아서 해당 게시판의 말초 우아렐에 대해 제대로 동작하는지 확인을 해보니.. 오오케이. 잘된다.
이단, 도스 5.0 시절 이후로 많이 향상되었다던 배치파일(.BAT)의 advanced 구문을 익혀보니.. set 명령어의 /p 옵션으로 변수를 입력 받아서 저장하는 것이 가능해졌음을 알게 되었다.
삼단, 마찬가지로 강산이 변하는 세월이 지나면서 많이 발전한 for구문도 연구를 해보니.. 괄호싼 그룹으로만 돌아가던 for 구문이... /L 옵션으로 숫자 스탭 운영이 가능해졌음을 알게 되면서 쾌제를 불렀다.
이 게시판은, view.cgi? 뒤에 게시물 번호를 지정하는데, 한번 지정하면 10개의 글이 보인다. 따라서 숫자를 10씩 건너 뛰면서 cgi에 쿼리하여 결과를 긁어와야겠다.. - -;;;
__일단 간단히 짜본 배치 파일____ (아, 이 얼마만의 배치 파일 스크립팅이더냐..ㅜ.T);;;
@echo off
set /p brd="Board URL? : "
set /p from="From where?: "
set /p upto="To where? : "
set /p step="[for]step? : "
for /L %%i in (%from% %step% %upto%) do wget %brd%?%%i
_____________________________________
오홀홀.. 훌륭히 돌아간다!! 테스트런을 돌리니, 내 하드 안에 사부작사부작 쌓인 각 페이지의 http 프로토콜 결과물들.. 므흣해진다. ^^; 하지만 복병이 기다리고 있었으니, wget이 기본으로 생성하는 파일이름은 우아렐의 끝 파일 부분에 번호를 붙여서 저장해주기 때문에 결국 확장자가 없는 이름의 파일들이 수북히 쌓이게 된다.
상세 설명을 요청하시는 분이 있어서 예를 들어가며 다시 덧붙이자면...

1. set 명령어로 환경변수에 내가 사용할 변수를 선언한다. set 명령어는 일반적인 도스 명령어이므로 변수 이름앞뒤에 %를 붙여서는 안된다. 선언한 변수를 사용할때에만 %를 붙인다고 생각하면 쉽다. /p 옵션으로 위 그림의 붉은상자 1번처럼 화면에 메세지를 출력하면 커서가 붉은숫자 2번 위치에 나타나 사용자로부터 값을 입력받아 변수에 담는 것이 가능하다. 긁어올 게시판 주소의 예는
http://www.kaka.kak/board/view.cgi로 입력했다. (그래서 예제화면에서 "그런 URL은 없으니 퍼올수 없다"는 문장이 반복되고 있다)
2. 마찬가지의 방법으로 set 명령어로 나머지 변수들을 선언한다. 붉은 숫자 3 4 5의 과정에서 어느번호에서부터 어느번호 이하까지 숫자를 얼마씩 올려가며 처리할지 사용자로부터 입력받고 있다.
3. for문을 돌려서 반복 실행할 명령문을 처리한다. 결국 가장 중요한 본체 한줄이다. (솔직히, 배치파일의 인자처리, 즉 %1 %2 %3 같은거 써서 해버리면 변수 입력부위도 필요없고 for문 하나로 끝나는 일이긴 하다 ^^;;; )
/L옵션을 (반드시 대문자로) 지정하면 in (어쩌구) 괄호안에 지정하는 3개의 숫자가 C언어처럼 [시작 스텝 끝]의 의미로 처리된다는 것이 포인트이다.
배치파일의 구문에서는
for /L %%i in (%from% %step% %upto%) do wget %brd%?%%i라고 되어 있다.
%%i는 for문의 반복처리를 위한 인덱스 변수가 실시간선언된 것이다. (굳이 i가 아닌 keke라든지 다른 이름을 지어도 무방하다.)
%%i 자리의 내용이 바뀌면서 여러번 명령어가 실행되게 된다. 커맨드라인에서 바로 for문을 수행할 때에는 %를 한번만 붙여 사용하면 되지만, 배치파일 내부에서 사용할 때에는 %를 두번 붙여야 한다. 배치파일에서의 변수는 마치 C언어의 preprocessor처럼 단순 문자열 대치라는 점을 참고하면 왜 2개를 붙이는지 짐작이 가능하다.
from과
step과
upto는 방금 환경변수공간에 선언한 변수를 사용하기 위해 앞뒤에 %를 붙인 형상이므로
(1 10 50)으로 내용이 대치될 것이다. 결국 for문에 의해 1, 11, 21, 31, 41 이렇게 다섯번의 실행으로 풀어진다는 얘기다.
결과적으로 for문은 다음과 같이 풀어져서 실행되게되고... (그림의 붉은숫자 6번)
for /L %i in (1 10 50) do wget http://www.kaka.kak/board/view.cgi?%i
%i 변수가 (1, 11, 21, 31, 41)로 처리되어 do 뒤에 있는 명령문이 다음과 같이 반복 실행된다. (그림의 붉은숫자 7 8 9번)
wget http://www.kaka.kak/board/view.cgi?1
wget http://www.kaka.kak/board/view.cgi?11
wget http://www.kaka.kak/board/view.cgi?21
wget http://www.kaka.kak/board/view.cgi?31
wget http://www.kaka.kak/board/view.cgi?41
__상세 설명 끝_____
그런데 아직 문제가 있었다. 나는 윈도우즈 탐색기의 검색기능을 활용하여 "이 텍스트가 파일 내부에 포함된 것까지 검색"해야 하는데... 이것이 제대로 돌아가 주지 않는다. 확장자에 의해 판단하는 파일의 형식이 "알수없음" 파일이기 때문에 텍스트 파일로서 인식이 안되어, 내부 내용 검색이 이루어지지 않는 것이다.
결국 이렇게 나로 하여금 wget의 옵션을 뒤적거리게 만들어준다.. - -;;;
오오.. -O옵션!! 출력 파일 이름을 지정하게 해주는군... 음.. 출력 파일 이름을 어떻게 처리해야할까.... 잠시 고민하다가 그냥 for의 리피트 변수를 그대로 써서 확장자 .txt만 붙여주기로... 다시 완성!
__batch file 다시 짜기____
@echo off
set /p brd="Board URL? : "
set /p from="From where?: "
set /p upto="To where? : "
set /p step="[for]step? : "
echo on
for /L %%i in (%from% %step% %upto%) do wget -O%%i.txt %brd%?%%i
___________________(echo on을 한 이유는, 그 이후 차라리 명령어 실행과정이 보이는 것이 좋을것 같아서)
오오.. 대충 잘 돌아가 준다. 결과 불펌 파일들은 텍스트 파일이 되어 탐색기 검색에서도 검색이 절절절 잘된다 ^^;
행복하다... 흐음.. 마지막으로 가비지 컬렉션에 관한 고민을 조금 더 해보다가. 말초적 파라노이아를 벗어나지 못하고 다음과 같이 몇줄을 추가해준다. - -;;; (성격 문제 있다 증말 - -)
__batch file 최종판____
@echo off
set /p brd="Board URL? : "
set /p from="From where?: "
set /p upto="To where? : "
set /p step="[for]step? : "
echo on
for /L %%i in (%from% %step% %upto%) do wget -O%%i.txt %brd%?%%i
@echo off
set brd=
set from=
set upto=
________________________________________________
므흙.. 옛날로 돌아가 하늘소의 통신애뮬 "이야기"의 스크립트도 다시 한번 짜보고 싶어졌다.
15년전엔 대화방 만원 시간대에 대화방을 열기 위해서, 또는 10년전엔 학교에서 인기과목의 수강신청을 하기위해서 별라별 스크립트를 다 짰었는데.. ^^;;;;
[07/04/18 업데이트]
문의가 들어왔다. 이 배치파일을 조금 더 범용적으로 사용할 수 있게 해달라는. ^^;;
배치파일 구문 감각이 있다면, for문에서 wget 이후 내용을 하드코딩 바꿔가며 사용하면 대략 원하는 상황에 맞춰 쓸수 있을 것이지만, 위에 작성한 소스의 경우, "view.cgi?숫자"로 끝나는 형식이 하드코딩되어 있어서 범용성이 떨어지는 것은 사실이다. 그래서 다시 한번 작성해본다.
__batch file 범용판____
@echo off
set /p brd="Board URL? : "
set /p from="From where?: "
set /p upto="To where? : "
set /p step="[for]step? : "
echo on
for /L %%i in (%from% %step% %upto%) do wget -O%%i.txt %brd%
@echo off
set brd=
set from=
set upto=
________________________________________________
간단하다 ^^; for문에서 ?%%i를 없애고, 사용자가 URL을 지정할 때에 직접 %i를 적절한 위치에 쓰도록 하는 것이다.
예를 들어보자. 구글에서 "된장녀"를 검색해보니 결과페이지의 URL은 다음과 같다.
http://www.google.co.kr/search?q=%EB%90%9C%EC%9E%A5%EB%85%80&hl=ko&lr=&newwindow=1&start=10&sa=N
뭔가 쓸떼없는 인자들이 마구마구 있는 것 같아서 없애보면.. 다음과 같다.
http://www.google.co.kr/search?q=%EB%90%9C%EC%9E%A5%EB%85%80&start=10&sa=N
따라서, 구글의 경우 10개씩 묵인 검색결과가 첫페이지, 둘째페이지, 셋째페이지 차례대로 다음과 같은 URL이 된다.
http://www.google.co.kr/search?q=%EB%90%9C%EC%9E%A5%EB%85%80&start=
10&sa=N
http://www.google.co.kr/search?q=%EB%90%9C%EC%9E%A5%EB%85%80&start=
20&sa=N
http://www.google.co.kr/search?q=%EB%90%9C%EC%9E%A5%EB%85%80&start=
30&sa=N
for문의 %i 변수가 적용되어야할 변수 위치가 URL의 중간에 있기 때문에 먼저 위에서 짰던 배치파일로는 처리가 불가능하다. 새로 짠 (짰다기보다는, 몇글자 지워줬을뿐인) 배치로는 가능하다.
이 검색결과중 7번째까지를 이 배치파일로 가져오려면... 실행하고선 이렇게 지정하면 된다 ::
__실행화면_________________________________
Board URL? :
http://www.google.co.kr/search?q=%EB%90%9C%EC%9E%A5%EB%85%80%26start=
%i%26sa=N
From where?: 10
To where? : 70
[for]step? : 10
____________________________________________
주의해야할 것이 두가지 있다.
첫째, for문의 순환변수가 될 %i를 적절한 위치에 직접 쳐넣어서 지정해야한다는점. (변수 입력 받는 커서에서 for문의 변수를 또 입력해도 되느냐고? 꼬이지 않느냐고? 꼬이지 않는다. 단순 문자열 대치 처리될 뿐이니까. 하지만 %를 두개붙이면 안되고 하나만 붙여야 한다는점 주의.)
둘째, &와 같은 글자들은 %HEX로 변환하여 입력해줘야 한다는 점. & | > < + 이런 문자들 모두 도스프롬프트에서 연산자 및 파이프라인들이기 때문에 그냥 넣었다가는 명령행이 꼬여버린다. 따라서 URL표준안의 %HEX로 인코딩해서 넣어줘야 한다. 이 예제에서는 &를 %26으로 인코딩해서 넣었다. (하필, 변수도 %이고 인코딩도 %이고 이거 원 헷갈려 죽겠다 - -;;; )
돌려보니 잘 돈다 ^^;;;
Trackback Address :: http://blog.enzoy.pe.kr/trackback/582