간혹 업체의 report api가 구비되지 않아서 크롤링을 한다거나, 주기적인 업데이트를 위해 크롤링이 필요한 경우가 있다.

그와중에 로그인 후 크롤링을 할 경우까지 종종 등장한다.

이때 오래되었으나 snoopy 라이브러리를 이용하면 좋다.

Snoopy download
https://sourceforge.net/projects/snoopy/

바로 import하여 사용한다.

<?php
require_once('lib/Snoopy.class.php');

$snoopy = new Snoopy;
$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";

//login
$loginUri = 'http://www.bluebee.co.kr/loginTest.php';

$snoopy->httpmethod = "POST";
$auth['id'] = 'bluebee';
$auth['password'] = '1234';
$snoopy->submit($loginUri, $auth);

$snoopy->setcookies();	//로그인에 쿠키를 사용하는 경우가 있으니 쿠키정보를 저장
$loginResult = json_decode($snoopy->results);

$report_data = array();

if($loginResult->{'ret'} != "ok") {
	echo 'Login 실패!';
	exit;
} else {
		
	//리포트 데이터 크롤링
	$reportUri = 'http://www.bluebee.co.kr/reportTest.php';
		
	$snoopy->httpmethod = "POST";
	$report['sdate'] = '2019-11-01';
	$report['edate'] = '2019-11-13';
	$snoopy->submit($reportUri, $report);

	preg_match('/<tr class="reportR">(.*?)<\/tr>/is', $snoopy->results, $result_report_tr);
			
	if(sizeof($result_report_tr) > 1) {
		preg_match_all('/<td[^>]*>(.*?)<\/td>/is', $result_report_tr[1], $result_report_td);
		
		/*데이터 정리*/
	}

}
?>

로그인이 필요한 경우 간편하게~

대충 이런 형태로 간단하게 뽑아낼 수 있겠다.

 

오류 발생 대처 방법

  • PHP Deprecated: The each() function is deprecated.
php버전에 따라 오류발생 가능

Snoopy.class.php 의 each 관련 사항을 모두 foreach로 수정

예)
while (list($key, $val) = each($links[2])) {
=> foreach($links[2] as $key => $val) {

그외 딱히 이슈될건 없다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.