간혹 업체의 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) {
그외 딱히 이슈될건 없다.

진짜 대단하시네요.
혹시 천재 아닌가요??
얼굴도 핸섬하신거 같은데 성코하시길요~!
감사합니다~ 성투합시다!