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

본문
PHP를 이용한 외부 웹사이트 특정 영역 크롤링 및 파싱 기법
Q.
외부 웹사이트 전체 페이지가 아닌 특정 주석 태그 영역만 파싱하여 그누보드 등 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라이브러리 사용을 고려하십시오.
함께 보면 좋은 글
참고자료
기타 참고자료
- 이전글그누보드 다국어(영어·중국어) 지원 및 언어별 패키지 활용 가이드 26.09.25
- 다음글SPAW 웹 에디터 설치 및 PHP 버전 호환성 설정 방법 26.09.24
댓글목록
등록된 댓글이 없습니다.