웹 개발을 진행하다 보면 외부 API 서버와 데이터를 주고받거나, 특정 웹 페이지의 HTML 콘텐츠를 원격으로 긁어와야 하는 웹 크롤링 및 데이터 스크랩(Scraping) 상황을 자주 마주하게 됩니다.
PHP에서 원격지 주소의 데이터를 가져오는 가장 단순한 방법으로 file_get_contents() 함수가 있지만, 이 방식은 세밀한 헤더 설정이나 세션 유지, 타임아웃 제어, 프록시 설정 등이 불가능하다는 치명적인 한계가 있습니다.
이번 포스팅에서는 실무 백엔드 시스템에서 가장 널리 쓰이는 강력한 네트워크 통신 라이브러리인 PHP cURL을 활용하여 안정적이고 유연한 웹 파서(Parser) 메서드를 구현하는 방법을 소스코드와 함께 알아보겠습니다. 아래 본문 가이드를 마우스로 드래그하여 깔끔한 텍스트 반전 효과를 확인해 보세요!
- CURLOPT_USERAGENT: 크롤링 대상 서버가 봇(Bot) 접근을 원천 차단하는 것을 우회하기 위해, 실제 브라우저인 것처럼 위장 헤더(User-Agent)를 필수적으로 주입해야 합니다.
- CURLOPT_TIMEOUT: 대상 서버의 응답이 지연될 때 내 서버까지 무한 대기에 빠져 마비되는 현상을 막기 위해 최대 대기 제한 시간(Timeout)을 반드시 설정해 줍니다.
- CURLOPT_SSL_VERIFYPEER: 보안 연결(HTTPS) 주소를 파싱할 때 SSL 인증서 검증 에러로 실패하는 경우가 많으므로, 필요에 따라 이 옵션을 FALSE로 꺼두는 우회 조치가 필요할 수 있습니다.
1. PHP cURL 웹 파서 공통 Helper 메서드 소스코드
프로젝트 내의 공통 통신 라이브러리나 컨트롤러 내부에 배치하여, 주소와 전송 데이터만 인자로 주면 즉시 원격 HTML 원문이나 API 결과 데이터를 반환하는 완성도 높은 실무형 클래스 메서드입니다.
/**
* @ cURL Parser 사용법
*
* @example : $content = $control->curl_parser("http://www.naver.com", "");
* @return : echo $content;
**/
public function curl_parser($url, $data) {
// 1. 차단을 방지하기 위한 실제 데스크톱 크롬 브라우저 에이전트 선언
$agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36';
// 2. cURL 세션 초기화
$curl_init = curl_init();
// 3. 내부 핵심 파싱 옵션 설정 정의
curl_setopt($curl_init, CURLOPT_URL, $url); // 파싱 타겟 URL 주소 매핑
// curl_setopt($curl_init, CURLOPT_SSL_VERIFYPEER, FALSE); // true 설정 시 인증서 만료 오류가 많으므로 상황에 따라 주석 해제
// curl_setopt($curl_init, CURLOPT_SSLVERSION, 3); // HTTPS 통신 시 필요한 SSL 버젼 설정
curl_setopt($curl_init, CURLOPT_HEADER, 0); // 결과값에서 헤더 정보 제외 (0 = 출력 안 함)
curl_setopt($curl_init, CURLOPT_RETURNTRANSFER, 1); // curl_exec 결과를 문자열로 반환받음 (1 = 반환)
curl_setopt($curl_init, CURLOPT_POST, 0); // POST 전송 여부 결정 (POST = 1, GET = 0)
curl_setopt($curl_init, CURLOPT_POSTFIELDS, "".$data.""); // POST 데이터 탑재 전송 처리
curl_setopt($curl_init, CURLOPT_USERAGENT, $agent); // 위장 브라우저 헤더 정보 주입
curl_setopt($curl_init, CURLOPT_REFERER, "https://www.naver.com"); // 경유지 확인 사이트 대응 리퍼러 주소 위장
curl_setopt($curl_init, CURLOPT_TIMEOUT, 120); // 웹사이트 지연 대응을 위해 2분(120초)간 타임아웃 대기 설정
// 4. cURL 통신 실행 및 버퍼 저장
$buffer = curl_exec($curl_init);
// 5. 통신 후 HTTP 상태 코드 등을 포함한 데이터 스냅샷 정보 추출
$curl_info = curl_getinfo($curl_init);
// 6. 점유한 리소스 반환 및 세션 종료
curl_close($curl_init);
// 7. [예외 처리] 정상 응답(200 OK)이 아닐 경우 에러 상태 코드 반환
if ($curl_info['http_code'] <{}> 200) {
return $curl_info['http_code'];
}
// 8. 최종 크롤링된 HTML 또는 API 데이터 스트링 리턴
return $buffer;
}
2. 핵심 예외 처리 메커니즘 설명
해당 메서드의 가장 큰 장점은 무조건 결과 버퍼를 리턴하지 않고, 하단부 조건절을 통해 $curl_info['http_code'] 값을 검사한다는 점입니다.
타겟 서버가 다운되었거나 페이지가 사라진 경우(404 Not Found, 500 Internal Server Error 등)가 발생하면, 불완전하거나 깨진 HTML 소스를 반환하는 대신 실제 HTTP 상태 에러 코드 번호를 즉시 반환하므로 백엔드 단에서 분기 에러 핸들링 처리를 하기에 매우 직관적이고 용이합니다.
3. PHP 공식 cURL 모듈 참조 문서 가이드
포스팅에 수록된 CURLOPT 상수의 세부 속성값 목록이나 프로토콜 옵션 설정, 대용량 파일 비동기 전송 처리 등 심화 스펙 정보는 아래 공식 PHP 개발자 매뉴얼 버튼 단추 링크를 통해 완벽하게 확인해 보실 수 있습니다.
4. 맺음말
cURL 파서 공통 유틸리티 함수를 서비스 엔진에 적절히 탑재해 두면 데이터 마이그레이션, 외부 오픈 API 연동, 가상 크롤러 수집기 배치 등 다양한 백엔드 엔지니어링 작업을 매끄럽게 처리할 수 있습니다. 운영 중인 개발 서버 인프라 환경과 타겟 도메인 스펙에 맞추어 타임아웃과 프롭 옵션을 튜닝하여 고성능 수집기를 구현해 보세요!