반응형

출처:https://gomcine.tistory.com/entry/PHP%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%ED%8C%8C%EC%8B%B1-%EA%B8%B0%EB%B2%95-%EC%9A%94%EC%95%BD


가끔 사이트 개발을 하거나 여러가지 데이터를 모으기 위해 웹페이지를 파싱해야할 경우가 있죠. 다양한 언어와 기법을 활용하여 웹페이지 파싱이 가능한데요. 저는 주로 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 데이터를 어떻게 파싱해서 데이터를 추출할 것인가에 달려 있는 것 같습니다. 첫 번째 부분은 어느 정도 정형화되어 있기 때문에 한 번만 잘 소스를 만들어두면 계속 재사용할 수 있으며 두 번째 부분은 웹페이지 구조를 얼마나 잘 분석하고 정규표현식을 잘 활용하여 데이터를 뽑아내는가에 달려 있는 것 같습니다.

반응형

+ Recent posts