Guzzle + domCrawler 을 이용한 심플 php 웹파싱(스크래핑)

들어가기 전에

파싱과 스크랩핑, 크롤링은 의미가 좀 다르지만, 한국에서는 보통 파싱이라는 단어로 통용된다.

파싱을 위해선 정규식을 쓰는게 일반적이지만, 웹의 데이타를 추출할때는 어려운점이 있다.

웹의 데이타를 파싱하기 위해 가장 보편적이고, 심플한 방법은 DOM 에서 데이타를 추출하는 형태이다. 웹페이지를 설계할때 css를 이용하여  계층적으로  만들기 때문에, 데이타를 추출하기 위해서도 계층적 구조로 접근이 가능한것이 유리하다.

Dom 파싱을  위해 각 언어별로 적당한 모듈이 있는데, 자바에서는 jsoup, 파이썬에선 BeautifulSoup 이 있고, nodejs 는 JSDOM, cheerio 가 있다.

문제는 PHP인데, 언어의 인지도에 비해 크롤링(파싱)부분이 취약하다.  그나마 정규식을 통해 파싱처리를 하는데, 조금 복잡한 웹페이지를 파싱할려면, 계층별로 split처리와 여러 정규식을 써야한다.  정규식 자체도 복잡하게되어 직관성이 매우 떨어지게 된다.(그러나 일단 데이타가 파싱만 되면, db처리나 활용이 편리한 이점이 있다.)

최근 php 로 데이타 파싱을 해야 할 일이 있어(정규식으로 해볼려다가 암걸리는줄 알았다.), 보던중에  php dom 파싱이 가능한 라이브러리가 있어 정리를 해본다. (물론 전통적인  php dom 파서가 있다. 타 언어에 비해 느리고, 잘 정의된 문서가 아닌 경우 오류가 심하고, dom 에 접근하는 방식이 직관적이지 못하다.)

웹 스크래핑(파싱) 라이브러리는 쉬운 사용법과, 직관적인 selector 사용이 가능해야 하며, 태그 일부가 유실되어 깨진 문서라고 하더라도 오류없이 파싱되어야 한다. 속도도 어느정도 되어야 한다.

설치

설치는 composer 를 통해서 설치할수 있다 

 

Guzzle + Dom crawler + css selector 라이브러리를 사용했는데, 굳이 따로 쓸필요없이, Goutte 라이브러리만 써도 된다. 아래 예제에서 Sir class는 위의 방식대로 작업한것이고, 아래 Sir2 클래스 파일은 Goutte를 사용한 방식이다. 내부에서 쓰는 라이브러리가 동일함으로 그냥 Goutte 를 쓰는걸 추천한다. 

예제코드중 Sir1 클래스는 sir.co.kr 자유게시판 목록을 스크래핑(파싱) 하는 코드이며, Sir2 클래스는 로그인 인증처리후 쪽지함 목록을 스크래핑(파싱)하는 코드이다. 본인이 테스트한 서버는 https 접속시 ssl 인증서 오류가 발생하여, 옵션 코드를 추가하였다.  

아래코드는 예제입니다. 테스트로만 사용하세요. 지나치게 많은 request를 sir.co.kr 로 보내면 아이피가 차단될수 있습니다.

예제코드

 

구현 코드를 보면, php에서 정규식을 사용하는것보다 심플하고 직관적으로 웹페이지 파싱이 가능하다는걸 알수 있습니다. php 에서 웹페이지에 대한 파싱이 필요한 경우 guzzle + dom crawler 는 좋은 선택이 될수 있습니다. 라이브러리 에 대한 자세한 사용법은 공식홈페이지와 아래 링크를 참고바랍니다. 

참고 정보

Scraping products from Walmart with PHP, Guzzle, Crawler and Doctrine

PHP Simple HTML DOM Parser vs FriendsOfPHP Goutte

Facebook Comments

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다