Dev Talks/Back-End Dev

PHP를 활용한 웹페이지 파싱 기법 요약

곰씨네IT 2017. 11. 15. 07:14

가끔 사이트 개발을 하거나 여러가지 데이터를 모으기 위해 웹페이지를 파싱해야할 경우가 있죠. 다양한 언어와 기법을 활용하여 웹페이지 파싱이 가능한데요. 저는 주로 PHP를 활용하여 웹페이지 스크랩하고 정규표현식을 통해 파싱 작업을 하고 있습니다. 그 내용을 간단하게 요약해 보도록 하죠.



파싱 대상 html 가져오기

1. echo file_get_contents(웹페이지 URL); => 서버 설정으로 막힌 경우가 많음.
2. curl (스누피라는 라이브러리 쓰면 좀 편함)
3. fsocketopen (최종 방법)


파싱할 때 주로 쓰는 함수 5가지

1. str_replace(".", "", $string); // . 삭제
2. $language = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] ); // 정규식으로 치환
3. preg_match_all('/[가-힣a-zA-Z0-9 ]*/i', $resultHtml, $find_words); => 그냥 preg_match 하면 1개만 가져옴
4. explode("-", "2017-09-20");
5. substr("테스트", 1, 2); => 스트
6. strip_tags("<b>테스트</b>")
7. print_r($array); => 배열 출력


정규표현식 상식

. => 모든 문자, .*? : 모든문자 최초매칭
greedy vs non-greedy (최대매칭 vs 최초매칭 => 조건이 만족되는 최초의 위치까지만 일치하는 것으로 간주 / ?를 사용함)
() : 그룹, [] : 범위


정규표현식 예시

preg_replace("/[#\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i", "", $title); // 특수문자 제거, 공백은 포함

/["[가-힣a-zA-Z0-9 ]*",/i

/\[[가-힣a-zA-Z0-9]*\]/
/[0-9,]+건/
/[0-9.]*[0-9.]/
/[0-9-]*[0-9-]/

/([0-9]{3}cm)/i
/([0-9]{2,3}kg)/i
/([A-Z]{1,2}형)/i

/^(to|cc|bcc|Reply-To)$/
/[^A-Za-z0-9!#$%&'*+\/=?^_`{|}~ -]/
/Location:\s([^\s]*)\s/
/(src|background)=["'](.*)["']/Ui
/^Get(\w+Service)$/I


결국 웹페이지 파싱 작업은 첫 번째로 웹페이지를 어떻게 스크랩할 것인가 그리고 두 번째로 가져온 html 데이터를 어떻게 파싱해서 데이터를 추출할 것인가에 달려 있는 것 같습니다. 첫 번째 부분은 어느 정도 정형화되어 있기 때문에 한 번만 잘 소스를 만들어두면 계속 재사용할 수 있으며 두 번째 부분은 웹페이지 구조를 얼마나 잘 분석하고 정규표현식을 잘 활용하여 데이터를 뽑아내는가에 달려 있는 것 같습니다.



** 336x280 **