-
PHP와 Goutte로 로또 당첨번호 데이터베이스 만들기 (클리핑, 스크레이핑)카테고리 없음 2015. 3. 26. 18:42
개발환경)
윈도우 7 PHP 5.6.3 (cli) (built: Nov 12 2014 17:18:08)
필수파일)
https://github.com/FriendsOfPHP/Goutte
상기 사이트의 중간 즈음에 [goutte.phar]이라는 파일을 다운로드하여, 같은 디렉터리에 넣어 배치함. 구뜨는 PHP5 이상에서만 실행가능.
실행환경)
커맨드라인에서 php {실행파일명} {시작회차} {끝회차} 당연하겠지만, 시작회차는 끝회차보다 적은 수를 입력한다.
php index.php 1 100
실행화면)
{실행 중인 회차수, 1회차분 경과시간, 실행 시작부터 현재까지 경과시간}이 표시된다.
실행결과)
회차수, 각 당첨번호 7개를 컴마 단위로 구분하는 텍스트 파일 numbers.txt 가 생성된다. 확장자를 csv로 바꾸면 엑셀에서 열어서 편집할 수 있음.
알고있는 오류)
아직 추첨하지 않은, 없는 회차수를 실행할 경우 [999,,,,,,,] 이런 식으로 컴마만 남게 되므로, 현재 몇회까지 진행되었는지 확인 후에 실행할 것.
실행 도중 어떠한 이유로 중단되었을 경우, 처음부터 새롭게 시작하기 위해서는, 같은 디렉터리에 있는 [numbers.txt]를 지우고 시작해야 함. 그렇지 않으면 계속 추가 기록함.
제작후기)
Simple HTML DOM Parser가 느려서 Goutte 공부할 겸 만들어봤다. 같은 로또 사이트를 스크레이핑하는데, 전자는 회차당 12초가 걸렸으나, 구뜨는 약 0.5초로 빠르게 실행되었다. 다음부터 웹사이트 크롤링, 스크레이핑은 구뜨로 결정했다. 사용법이 좀 까다로운 것 빼면 훌륭한 프로그램. 구뜨 제작자님께 감사를 드립니다.
소스코드)
마음껏 사용하되, 다른 블로그 및 인터넷 게시판에 전재금지입니다. 본가 사이트에 알려져서 좋을 건 없을 듯...
require_once('goutte.phar'); use Goutte\Client; if (count($argv) < 3) { echo "[Usage]" . PHP_EOL; echo "php {$argv[0]} drwNoMin drwNoMax" . PHP_EOL; exit; } $drwNoMin = $argv[1]; $drwNoMax = $argv[2]; $drwNo = $drwNoMin - 1; $first_time = microtime(TRUE); while($drwNo++ < $drwNoMax) { $start_time = microtime(TRUE); $url = "http://nlotto.co.kr/lotto645Confirm.do?method=byWin&drwNo=$drwNo"; $client = new Client(); $crawler = $client->request('GET', $url); $number = $crawler->filter('p.number > img')->each( function($node) { return $node->attr('alt'); }); $number_bonus = $crawler->filter('p.number_bonus > img')->each( function($node) { return $node->attr('alt'); }); $number = array_merge( (array) $drwNo, $number, $number_bonus ); $number = implode(',', $number); file_put_contents("./numbers.txt", $number . PHP_EOL, FILE_APPEND | LOCK_EX); $idx = sprintf("%03d", $drwNo); $end_time = microtime(TRUE); $unit_time = sprintf("%.3f", round($end_time - $start_time, 3)); $elapse_time = sprintf('%.3f', round($end_time - $first_time, 3)); echo "$idx, $unit_time, $elapse_time" . PHP_EOL; }