요즘 뽐뿌에 정신이 나간 이들이 너무 많고 코멘트 추천수 조작으로 핫코멘트를 도배해 여론 조작을 시도하는게 눈에 보여 틈틈이 박제를 뜨는 작업을 손으로 하다가 이걸 왜 내 시간을 써가며 손으로 하고 있나 싶어서 간단하게 스크립트를 짜보기로 했어요.


목적은 다른거 없어요. 이 짓으로 니들 중 단 한명이라도 삶에 불이익을 받았으면 좋겠습니다. 니들 삶이 불편해졌으면 좋겠습니다. 그러면 기본적인 목적은 달성했다고 봅니다. 부디 니들이 남긴 댓글과 추천조작이 평생 기록에 남고 언젠가는 니들의 인생을 발목잡기를 빕니다.


사용 환경은 msys2 with bash.



사용 CMD는 다음과 같습니다.



$ seq 1 100 | while read NUM ; do curl -s "http://m.ppomppu.co.kr/new/hot_comment.php?search_type=&page=$NUM" | grep -a main_text02 | grep -a "\<a href" | awk -F"<" '{print $2}' | awk -F\" '{print $2}' | awk -F\& '{print $1, $2}' | while read A B ; do curl -i -d url="http://m.ppomppu.co.kr$A%26$B%26v=$(date +%Y%m%d%H)" http://archive.today/submit/ ; done ; done



뽐뿌 핫코멘트들을 기반으로 페이지를 파싱해서 archive.is 에 던지는건데요.


아무래도 sleep을 걸었어야 했나봐요.


한 1000여개정도 되다가 일시적으로 블럭당해 버리네요. 돌다가 멈춰서 좀 아쉽습니다 ㅎㅎㅎ


개별 while 문 사이에 sleep 10~30 정도를 넣어서 천천히 돌리는 것이 좋겠습니다. (어차피 해당 서버에서 queue에 넣어두고 천천히 처리합니다 빨리 할 필요가 없는 것 같아요. 아까 한시간도 전에 돌렸다가 멈춰진게 아직 500 번째쯤의 queue에 있네요. 아하하하~)


이번에는 대용량으로 한번 전체 백업을 떠놔야지 싶어서 대용량으로 돌렸지만 핫코 리프레시 타임을 감안하면 crontab 에 넣어서 대략 20~30분에 한번씩 2~3페이지 정도를 아카이빙하는 것으로 충분하겠지요.




여기에 쓰인 일부 기술사항을 정리해보죠.



* seq 1 100 -> 1~100 까지 출력합니다.


* curl -s (slient 모드) 하면 curl 이 progress meter 를 출력하지 않습니다.


* grep -a 는 순수 text가 아닌 binary 에서 grep 하고 싶을 때 사용합니다. curl 이 가끔 binary 출력 비슷하게 하는 경우가 있는 모양이더군요. 그냥 grep 하면 상당 부분은 binary라면서 못잡습니다. "Binary file (표준 입력) matches" - 영어로는 Binary file (standard input) matches - 라는 메시지를 내뱉지요.


* curl -d url=<url> http://archive.is/submit : archive.is 측에서 제공하는 curl 사용방식입니다. -i 는 굳이 필요없어요 그냥 전 좀 보고 싶어서 넣은것이기는 하구요. (참조 : https://github.com/bibanon/webcache-scraper/blob/master/upload-archive-is.sh) -d 는 HTTP POST 방식으로 data를 전달하는 방법입니다.

  - 위 내용이 아니라도 archive.is 에서 제공하는 bookmarklet 내용을 보아도 추론할 수 있습니다. - javascript:void(open('http://archive.today/?run=1&url='+encodeURIComponent(document.location))) <- GET 으로 처리해도 될 걸 그랬나보다 싶기도 하구요?


* %26 : & 문자를 처리합니다. (참조 : https://www.w3schools.com/tags/ref_urlencode.asp) - 그냥 & 로 하면 아무래도 안들어가요. ' 건 " 건 \ 건 어떤 escape 방식을 사용해도 curl의 -d 에서는 처리 못하네요.


* &v=(%26v=) : GET request 사용시 v= 등을 사용하는것은 약간 트릭에 가까운데요. 개발자들이 별 의미없이 version numbering 하는데 쓰이는 매개변수 사용방식 중 하나입니다. 이걸 사용함으로서 브라우저 캐시를 업데이트하거나 똑같은 페이지이지만 URL 기반을 인삭하는 서비스에서 서로 다른것처럼 인식시키는 데 사용하지요. archive.is  서비스는 기존애 캐시된 URL을 호출하면 이미 캐시된 페이지가 있는데 새로 할 것이냐? 라는 질문을 합니다. 브라우저에서 호출할때야 인터렉티브하게 마우스로 클릭하면 될 일이지만 이런 대용량 배치를 돌리는 경우라면 매개변수를 덧붙여 새로운 페이지를 캐싱하도록 처리하는게 효율적이지요.


* date +%Y%m%d%H%M : 년월일시. 분 초 까지 들어가면 %M%S 를 추가하면 됩니다. - 다만 뭐 시간단위로 뜨면 충분하지 않나 라고 생각합니다.


* 굳이 뽐뿌의 모바일 페이지를 사용하는 이유 : 뽐뿌를 www.ppomppu.co.kr 기반으로 캐싱하면 게시물 당 한 페이지에 보이는 댓글 갯수가 굉장히 제한적입니다. 그러니 전체 아카이빙을 하고 싶다면 모바일 기반으로 아카이빙을 떠 두는것이 유리합니다.


* archive.today 보유 도메인 (201902 현재)


archive.today
archive.is <- 곧 멈출 예정이라고 지속적으로 이야기 중
archive.li
archive.fo
archive.vn
archive.md
archive.ph
archivecaslytosk.onion




원래는 겸사겸사 웹 크롤링 처리 공부차 python으로 짜려고 했어요. 파이썬은 뭐 archiveis 라는 python 모듈(https://pypi.org/project/archiveis/)도 있고 해서 편하겠다 싶기도 했구요.


근데 그냥 기능만 하면 된다 싶으면 뭐하러 그러나 싶기도 하고 소스를 보니 grep + awk 만으로 파싱해도 충분하겠다 싶어서 그냥 bash 로 대충 슥슥 삽질해서 돌려보니 잘 작동하길래 그냥 bash로 만들었네요. (Keep it simple, stupid!)


참고로 msys2에는 기본적으로 crontab 이 존재하지 않습니다. cron job으로 처리하고 싶다면 linux environment 에서 구동시키거나, 아니면 사용하려는 전체 명령어를 다시 while 문으로 sleep 을 좀 길게 줘서 주기적으로 작동하도록 하는게 좋겠습니다.



그럼 최종적으로는?


$ while true ; do seq 1 3 | while read NUM ; do curl -s "http://m.ppomppu.co.kr/new/hot_comment.php?search_type=&page=$NUM" | grep -a main_text02 | grep -a "\<a href" | awk -F"<" '{print $2}' | awk -F\" '{print $2}' | awk -F\& '{print $1, $2}' | while read A B ; do curl -i -d url="http://m.ppomppu.co.kr$A%26$B%26v=$(date +%Y%m%d%H)" http://archive.today/submit/ ; sleep 30 ; done ; done ; sleep 1200 ; done 


이 정도면 되지 않을까요?

+ Recent posts