BOARD

자료·레퍼런스

PHP를 이용한 외부 웹사이트 특정 영역 크롤링 및 파싱 기법

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 17회 작성일 26-09-24 16:49

본문

PHP를 이용한 외부 웹사이트 특정 영역 크롤링 및 파싱 기법

외부 웹사이트 전체 페이지가 아닌 특정 주석 태그 영역만 파싱하여 그누보드 등 PHP 환경에 적용하려는 운영자와 개발자를 위한 핵심 확인 사항과 해결 방법을 안내합니다.

외부 웹사이트 특정 영역 크롤링 및 파싱 기법

외부 웹사이트의 전체 페이지가 아니라 특정 영역만 추출하여 가져오려면 file() 함수로 페이지를 배열 형태로 읽어온 뒤, 특정 주석 태그를 기준으로 루프를 돌며 데이터를 필터링하는 방식을 사용할 수 있습니다.

주요 함수 및 로직

  • file() 함수: 지정된 파일이나 URL의 내용을 읽어 한 줄씩 나누어 배열에 저장합니다.
  • 주석 태그 기준 필터링: <!-- SET1 -->과 같은 특정 주석 태그를 기준으로 루프를 순회하며 원하는 영역의 데이터만 출력하거나 추출합니다.

구현 예시 코드

<?php 
// PHP 5.3 이상에서는 file() 대신 cURL 사용 권장
$a = file("http://www.yahoo.co.kr"); 
$cnt = count($a); 
$assa = 0; 
for ($i = 0; $i < $cnt; $i++) { 
 if (preg_match('/<!-- SET1 -->/', $a[$i])) 
 $assa = 1; 
 if ($assa == 1) { 
 echo $a[$i]; 
 } 
 if (preg_match('/<!-- /SET1 -->/', $a[$i])) 
 $assa = 0; 
} 
?>

주의 사항 및 환경별 차이

  • ereg() 함수 호환성: 원문에 사용된 ereg() 함수는 최신 PHP 버전에서 deprecated 되었으므로, 최신 환경에서는 preg_match() 함수로 대체하여 정규식 매칭을 수행해야 합니다.
  • 구조 변경 대응: 대상 웹사이트의 HTML 구조나 주석 태그가 변경될 경우 코드 수정이 필요합니다.

PHP ereg() 함수 대체 방법

최신 PHP 버전(PHP 5.3 이상에서 deprecated, PHP 7.0 이상에서 완전히 제거)에서는 ereg() 함수를 사용할 수 없습니다. 이를 대체하기 위해서는 preg_match() 함수를 사용해야 합니다.

주요 변경 사항 및 주의사항

  • 함수 교체: ereg() 함수는 preg_match()로 대체합니다.
  • 구분자 필수: preg_match()는 Perl 호환 정규표현식(PCRE)을 사용하므로, 패턴의 시작과 끝에 슬래시(/)와 같은 구분자를 반드시 추가해야 합니다.
  • 대소문자 구분: 대소문자를 구분하지 않고 비교하려면 패턴 끝에 i 옵션을 추가합니다(예: '/pattern/i').
  • 정규식 문법: ereg()와 preg_match()는 정규식 문법에 차이가 있으므로, 기존 패턴을 최신 문법에 맞게 수정해야 할 수 있습니다.

코드 적용 예시

기존 ereg() 사용 방식: if (ereg('pattern', $str)) {... }

수정된 preg_match() 사용 방식: if (preg_match('/pattern/', $str)) {... }

웹사이트 구조 변경 및 크롤링 실패 시 점검 사항

외부 웹사이트의 개편 등으로 대상 사이트의 구조가 변경되거나 파싱 코드가 실패할 때는 다음 요소를 점검해야 합니다.

  • 파싱 기준 및 HTML 구조 변경 확인: 대상 사이트의 소스가 개편되어 추출하고자 하는 기준이 되는 특정 주석(예: <!-- SET1 -->, <!-- /SET1 -->)이나 태그 구조가 변경되었는지 확인해야 합니다. 사이트 구조가 바뀌었다면 그에 맞춰 크롤링 코드를 수정해야 합니다.
  • 함수 호환성 점검: 사용 중인 PHP 버전에 따라 ereg()와 같은 구형 함수는 deprecated 되었으므로, 최신 환경에서는 preg_match() 등으로 대체되었는지 점검이 필요합니다.

상황별 판단 및 대응 가이드

내 상황선택 기준다음 행동
외부 사이트 특정 영역 추출 필요file() 함수로 페이지를 배열로 읽어 주석 태그 기준 필터링주석 태그(<!-- SET1 -->)를 기준으로 루프를 돌며 데이터 추출
최신 PHP 버전에서 ereg() 에러 발생preg_match()로 함수 교체 및 정규식 문법 수정패턴 구분자(/) 추가 및 필요 시 i 옵션 적용
대상 사이트 구조 변경으로 파싱 실패추출 기준이 되는 HTML 태그나 주석의 변경 여부 확인변경된 구조에 맞춰 필터링 로직 및 정규식 패턴 재설정

Q. ereg() 함수 대체 시 정규식 패턴 작성 시 주의할 점은 무엇인가요?

  • preg_match()는 Perl 호환 정규표현식을 사용하므로 패턴의 시작과 끝에 슬래시(/)와 같은 구분자가 필수입니다. 대소문자 구분 없이 매칭하려면 패턴 끝에 i 옵션을 추가하십시오.

Q. 사이트 구조 변경 외에 파싱이 막히는 다른 원인이 있나요?

  • 서버 설정에서 allow_url_fopen이 비활성화되어 있으면 file() 함수로 외부 URL을 읽을 수 없습니다. php.ini 설정을 확인하거나 cURL 라이브러리 사용을 고려하십시오.

함께 보면 좋은 글

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.