ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;
    }
    


Designed by Tistory.