룰루루룰루 크롤링은 재밌어

Posted at 2013.03.02 02:11 | Posted in 잡담

대한민국 학교 목록 받아오고 싶었던 그 날.

일부 교육청에선 한 번의 요청에 모든 학교 목록을 뿌렸지만

그렇지 않은 교육청이 과반이였다.


일단 되는 거만 넣어두자 하고 수집한 학교는 모두 3천개.




다음 날 매우 좋은 방법을 생각했다.


가에서 힣까지 모든 한글 문자를 루프로 돌리는 것이다.


처음엔 무식하게 한 교육청에 한 번에 1000개 요청을 보내서 최대한 빨리 끝내자고 생각했다.

한 번 요청에 1초 걸린다 생각하고 11.172초만 기다리면 한 교육청의 모든 학교 목록을 수집할 수 있지 않은가.



그래서 시도했다.


1% 진행 중이었을까.

돌아오는 것은 WebException, 내용은 요청 시간이 초과되었습니다.


젠장.. 세상은 참 밝지 않은가 보다.



그래서 다시 시도했다.

이번엔 요청하기 전에 100ms의 대기 시간을 가진다.



0% 진행 중이었을까.

돌아오는 것은 WebException, 내용은 요청이 거부되었습니다.


젠장할..



원인을 분석해봤더니 나이스 이용약관에서 이런 항목을 발견했다.


제4장 의무 및 책임

■ 제15조 (회원의 의무)

④ 회원은 당 사이트 서비스 이용과 관련하여 다음 각 호의 행위를 하여서는 안됩니다.

14)서비스의 안전적인 운영에 지장을 주거나 줄 우려가 있는 일체의 행위


이런거였나.

결국 내가 각 교육청에 한 번에 1000개 요청을 보낸게 잘못이였나.




그래서 다시 시도했다.

이번엔 각 교육청에 한 번에 1개 요청을 보내면서 100ms 간격으로 쉬는 시간까지 존재한다.





성공이다!


드디어!


비록 요청 보낼 때마다 100ms를 기다리고 11172개 요청을 보내야 한다지만

WebException을 받지 않을 수 있게 되었다!!



감격, 또 감격.


모든 학교 목록 가져오기 까지 30분이 걸렸지만

무슨 상관인가!




그래서 만들었다.


저 멋지지도 않은 콘솔을 버리고 나만의 관리도구를 만들어

나 혼자라도 폼내면서 학교 목록을 수집하자고 생각하면서.




오오오오오오!!


이건 꽤나 멋지다!

정말 멋져!



콘솔 프로그램이 있는데 왜 굳이 GUI 프로그램까지 만든건지 모르겠지만


일단 멋져!




그리고 결과를 확인했다.


총 20172개 학교가 수집됬잖아! 좋았어!

이건 후대에 남겨도 좋은 기록이야!



이렇게 내 대한민국 학교 목록 수집 프로젝트는 성공적으로 끝났다.





끝났을 터였다.




몇 일 후, 내 망한 1학년 생기부는 어떻게 생겼을까 하며 나이스 홈페이지를 들렀다.


공인 인증서를 등록하라길레 했다.


학교를 선택하는 팝업 창이 떴다.



떴다.

학교를 선택하는 팝업 창이.



각 교육청 홈페이지에서만 가능한 줄 알았던 학교 검색 기능은

나이스에서도 됬다.




그래서 확인했다. 개발자 도구로.


각 교육청에서 학교 검색할 때와 똑 같 은 데이터를 출력하는 페이지가

나이스에도 있었다.





각 교육청에 11172개 요청을 보냈던 나는 무엇인가.


30분을 기다려가며 20172개 학교를 수집한 나는 무엇인가.




난 바보가 아냐.

난 바보가 아냐.


같은 생각만 하면서

각 교육청에 1000개 요청을 보내는 프로그램을 수정해

나이스에 1000개 요청을 보내는 프로그램으로 만들었다.


100ms의 기다림의 시간도 제거했다.




20172개 학교를 수집하는데 걸리는 시간은 20초였다.





이래서 크롤링은 재밌다. 룰루루룰루...


괜히 자랑용으로 올리는 프로그램 소스

저작자 표시 비영리
신고
  1. 비밀댓글입니다
    • 2013.07.14 15:14 신고 [Edit/Del]
      네. 네트워크 분석기 등을 이용해서 해당 사이트의 어떤 페이지에서 검색 결과를 받아오는 지 알아낸 다음 프로그램적으로 그 페이지에 탐색을 요청하면 받을 수 있습니다.
      근데 요즘엔 사용자가 로봇인지 사람인지 판단하는 알고리즘이 워낙 발달해 있어서 api를 제공하면 api를 쓰는 게 좋습니다.
  2. 비밀댓글입니다
  3. tmchojo
    프로그램 실행하는 방법 좀 알려주세요 ~ ~
    아이디랑 서버랑 ..이요..
    • 2013.08.14 21:32 신고 [Edit/Del]
      Server는 DB 서버 주소, ID는 DB 사용자 아이디, PW는 DB 사용자 비밀번호, DB는 사용할 DB 이름입니다.
      그리고 이 프로그램 사용하기 전에 다음 sql로 테이블 먼저 작성하셔야 되요.

      CREATE TABLE IF NOT EXISTS `carte_schools` (
      `id` char(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `name` varchar(100) NOT NULL,
      `course` tinyint(1) unsigned NOT NULL,
      `address` tinytext NOT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    • tmchojo
      2013.08.18 12:50 신고 [Edit/Del]
      형식이 잘 안맞다고 떠서
      CREATE TABLE IF NOT EXISTS `carte_school` (
      `id` char(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `name` varchar(100) NOT NULL,
      `carte_boards` varchar(100) NOT NULL,
      `course` tinyint(1) unsigned NOT NULL,
      `address` tinytext NOT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      CREATE TABLE IF NOT EXISTS `carte_boards` (
      `id` char(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `idx` char(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `name` varchar(100) NOT NULL,
      `boards` varchar(100) NOT NULL,
      `url` varchar(100) NOT NULL,
      `course` tinyint(1) unsigned NOT NULL,
      `address` tinytext NOT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      이렇게 추가해봣는데도 오류나네요 ~.~
    • 2013.08.18 21:11 신고 [Edit/Del]
      KRSchoolIndexer의 테이블 생성 sql은 다음 걸 사용해주세요.
      당연히 속도 빠른 게 좋으니까 이걸 하셨겠지 생각하고 KRSchoolIndexer2의 테이블 생성 sql 적어 드렸는데 그게 아니였네요...

      DROP TABLE IF EXISTS `carte_schools`;
      CREATE TABLE `carte_schools` (
      `id` char(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `name` varchar(100) NOT NULL,
      `board` tinyint(2) unsigned NOT NULL,
      `course` tinyint(1) unsigned NOT NULL,
      `address` tinytext NOT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`),
      KEY `board` (`board`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      DROP TABLE IF EXISTS `carte_boards`;
      CREATE TABLE `carte_boards` (
      `idx` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
      `url` varchar(100) NOT NULL,
      PRIMARY KEY (`idx`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

      ALTER TABLE `carte_schools` ADD CONSTRAINT `carte_ibfk_2` FOREIGN KEY (`board`) REFERENCES `carte_boards` (`idx`) ON DELETE CASCADE ON UPDATE CASCADE;
    • tmchojo
      2013.08.23 20:42 신고 [Edit/Del]
      에구 바빠서 이제서야 돌려보네요 ㅎ
      감사합니당 ~ ~
  4. 이야기
    고등학교만 선출 하는 방법은 없겟지.......
    라고 해도 지금 하는 프로젝트 이리저리 설명 해주고 싶은데 시간 되시면 구글+로 답변좀
  5. david
    인터벌도 없는 크롤링이라.. 윤리적으로 바람직하지 않네요. 이걸 자랑할 일은 더더욱 아니고요.
  6. 골까네
    양심이 없는 기술이 어떤 결과를 보여주는지 옥시 사태를 보면 알 수 있지요.
  7. ㅇㅇㅇ
    차라리 네이버 지도 쪽을 크롤링하는게 지도 좌표 까지 얻을 수 있고 더 좋아요.

Name __

Password __

Link (Your Website)

Comment