간혹 업체의 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) {
그외 딱히 이슈될건 없다.
진짜 대단하시네요.
혹시 천재 아닌가요??
얼굴도 핸섬하신거 같은데 성코하시길요~!
감사합니다~ 성투합시다!