-
PHP 정규표현식을 이용해서 사이트 긁어보자 (노가다 없이 자료 수집하는 방법)파싱의 추억 2010. 3. 27. 01:54
"사이트 긁어오기" 다른말로 사이트 파싱작업을 하는 이유는 단순하다. 노가다를 컴터에게 대신 시키기 위해서다. 로또번호를 일주일마다 입력하기 귀찮기 때문에 나눔로또 사이트에서 매주 로또 번호를 긁어온다. 경쟁사의 상품을 매번 찾아 볼 수가 없기 때문에 옥션을 주기적으로 긁어 온다.
사이트 긁어오기를 구현하기 위해서는 정규표현식이 필수다. 정규표현식을 몰라도 가능은 하다. 소스가 지저분해지고 나중에 수정하기면서 욕나오는 것만 빼면.. 정규표현식이라는 녀석이 간단해 보이지만 쓸 때마다 헤깔리고 잊어버린다. 그래서 사이트 긁어오는 방법을 간단히 정리해본다.
그전에 php에서 정규표현식을 사용하는 방법을 간단히 걸어 넘어가자. php에서 정규표현식을 쓰는 방법은 여러가지다. 개인적으로는 아래방법을 이용한다.include 'class.snoopy.php';
$snoopy=new snoopy;
$snoopy->fetch("http://moonseller.net");
$txt=$snoopy->results;
$rex="/[0-9]{4}/";
preg_match_all($rex,$txt,$o);
print_r($o);
사실 사이트 긁어오기는 이게 전부다. 여기서 $rex로 시작하는 정규표현식을 어떻게 요리하는가가 관건이다.
일단 사이트를 긁어오는데는 snoopy 라는 사이트파싱 클래스를 이용한다. 간혹 호스팅에 보면 fopen 함수가 막혀있을때가 있다. fopen이 막혀있어도 curl 함수는 막아놓지 않는데, snoopy 클래스는 curl 함수를 편하게 사용 할 수 있게 해준다. 스누피 클래스에 대해서는 예전에 적은 글을 참조..
$txt에 사이트의 소스가 담겨졌다. 이 소스를 정규표현식을 이용해서 원하는 내용을 뽑아낸다. 예제에서는 숫자 4자리를 뽑아 내기로 되어 있다. [0-9]는 0에서 9까지 라는 의미이고 , {4}는 4자리라는 의미다.
preg_match_all 함수는 내용($txt)에서 정규표현식($rex)에 딱 맞는 녀석들을 뽑아내서 배열($o)로 만들어준다. 여러함수 써봤는데 이 함수가 제일 쓰지 편했다.
결과값으로 나온 배열을 DB에 넣던 TXT로 저장하든 화면에 뿌려주던 .. 그건 알아서 하시고.. 사이트 긁어오기에 유용한 정규표현식 몇가지를 보자.
전화번호만 뽑아내기
$rex="/[0-9]{3}-[0-9]{4}-[0-9]{4}/"
이메일만 뽑아내기
요즘엔 이런식으로 이메일 수집을 못하게 이미지로 처리하는 경우가 많다.$rex="/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/";
특정태그로 둘러 쌓인 내용만 뽑아내기
이 녀석이 핵심이다. 보통 영어로만 된 경우에는 [A-Za-z]* 라고 하면 되는데, 한글일 경우 참으로 애매해진다. 그럴때 아래와 같은 꽁수(?)를 쓴다.
$rex="/\<span id=\"moonseller\"\>[^>]\<\/span\>/";
이정도만 하면 왠만한 사이트들은 다 긁어 올수 있다. 좀 더 알고 싶으면 아래 링크들을 참조하자.
- 나눔로또에서 로또 번호 긁어오기
- 정규표현식으로 긁어온건 아니지만, 다음메인 뉴스 긁어오기
- 옥션에서 상품리스트 긁어오기
- 정규표현식에 대해서 좀더 심도 있게 공부하고 싶으시면?
- 정규표현식을 좀더 편하게 쓸수 있게 해주는 class
이 방법외에 xml 파싱하는 방법도 있다. xml 파싱으로 하면 좀더 쉽게 머리 안쓰고 긁어올수 있다. 문제는 긁어올 사이트가 완벽한 코딩이 되어 있어야 한다. xml이라는 녀석이 워낙 깐깐해서, 조금이라도 코딩을 잘못하면 에러를 토해낸다. 그래서 정규표현식을 이용하는 방법이 좀 더 안전하다.
항상 말하지만, 사이트 긁어오는 것은 약점이 있다. 사이트 디자인이 바뀌어 버리면 다시 정규표현식을 만들어야 한다. 그래서 자동으로 긁어오게 만들었다면, 사이트 디자인이 바뀌었을때를 대비해서 알림서비스가 필수다. 알림이 오면 즉시 소스를 수정해야한다.
사이트 파싱에 궁금한점이나, 의뢰는 로 주세요 ^^
'파싱의 추억' 카테고리의 다른 글
7만원으로 집에서 리눅스 웹서버를 돌려볼까? (28) 2010.04.20 PHP 스누피로 사이트 긁어오기가 되지 않는 사이트를 긁어오는 3가지 방법 (9) 2010.04.19 네이버 블로그를 티스토리로 자동으로 이사하기 (76) 2009.11.11 [php+snoopy] 나눔로또에서 로또번호 긁어오기 (10) 2009.04.30 [PHP+snoopy] 옥션리스트 긁어오기와서 RSS 만들기 (10) 2008.09.28