'크롤러'에 해당되는 글 2건

  1. 2015.02.07정규표현식을 활용한 html 태그 제거
  2. 2015.02.07Crawler의 개발 과정

String 자료형을 다루기 위한 좋은 방법 중 하나로 정규표현식이라는 것이 있다.

본 프로젝트에서 사용된 크롤러에서도 들어가 있는 내용 중 하나로, 한번 만들어두면 계속해서 사용할 수 있기 때문에 이 곳에 적어두도록 한다.

%s는 지우고 싶은 태그명을 넣어두면 된다. 방법에 따라 분류하도록 한다.

1. html의 태그를 지울때 내용까지 지우는 방식이다. 예를들어 <script>asd</script> 로 되어 있다면, asd까지 모두 지우게 된다. 이러한 것은 html문서 중 내용으로써, 쓸모없는 부분인 script나 style태그 등 뷰의 값을 지정해둔 부분을 모두 지워버리기에 유용하다.

<( )*%s([^>])*?> -> <%s>로 치환

<( )*(/)( )*?%s()*> -> </%s>로 치환

 

--> 여기까지 태그안의 내용이 있는 부분을 모두 지우고, 태그만으로 남길수 있다. 예를 들면, <style weight = ...........>로 되어있다면, <style>로 변환한다.

 

(<%s>)([^(<%s>\.</%s>)])*?(</%s>) 는 공백으로 치환

(<%s>)[\s\S]*?(</%s>) 역시 공백으로 치환

 

2. html의 태그를 지울때 태그만 지우는 방식이다.  <script>asd</script> 로 되어 있다면, asd만 남기게 된다.

<( )*%s([^>])*?> -> <%s>로 치환

<( )*(/)( )*?%s()*> -> </%s>로 치환

 

태그를 정규화후, 해당 태그만을 지우면 된다. <%s>, </%s> 등으로 공백으로 삭제.

 

 

3. 기타 쓰레기 값 삭제 부분이다. 파싱을 하다보면, html태그가 아닌 이상한 value가 존재한다. 이런 것들은 휴리스틱하게 찾아보는 수밖에 없는 것 같다.


(&deg(;)|&lt(;)|&gt(;)|&quot(;)|&nbsp(;)|&amp(;)|&lsquo(;)

|&rsquo(;)|&#160(;)|&ldquo(;)|&rdquo(;)|&sdot(;))


를 공백으로 바꿔주면 된다.

 

 

4. 개행문자 삭제 부분이다.

(\\r){1,20}|(\\n){1,20}|(\\r\\n){1,20} {1,20}는 은 해당 그룹 (???)의 출현빈도에 따라서 적용할 수 있는 방법이다. 

 

5. 모든 태그를 지우는 방법은 다음과 같다.

<(/)?([a-zA-Z0-9]*)(\\s[a-zA-Z0-9]*=[^>]*)?(\\s)*(/)?>

 

남은 응용은 정규표현식과 관련된 내용을 찾아서 응용하길 바란다.


반응형
Posted by N'

Crawler란 웹에서 지속적으로 데이터를 수집해오는 녀석을 말한다.

어떤 Root Url을 기초로 문서를 파싱 그 안의 Url을 수집해서 계속적으로 문서를 파싱하며, 그 안에서 유용한 내용은 따로 DB에 저장해두도록 한다.

본 프로젝트에서는 수많은 자료가 필요하기 때문에 하둡의 분산 저장 시스템인 hdfs에 저장하도록 하였다. 

Crawler의 기본적인 구조는 총 세가지 단계로 나누어 진다. (Master, Slave, Monitor)

Master는 기본적으로 Url을 지속적으로 수집해주는 녀석, Slave는 데이터를 파싱하고, 그 안에서 Url이 있으면, 어떠한 공유 저장공간으로 보내게 된다.

본 프로젝트에서는 네이버의 뉴스 Url을 가져오도록 하기 때문에 위의 과정까지는 필요없지만, 마스터가 Url을 지속으로 수집해 메모리상에 구현된 큐에 넣어주고, 슬레이브는 이 큐에서 데이터를 빼내 수집하도록 하는 구조이다.

 

아래는 발표 때 썼던 PT자료.(아래 그림을 본다면 바로 짜볼 수 있지 않을까? ㅋ)

 

본 프로젝트 백업을 위해 소스는 첨부. ㅋ

CrawlerEnd.zip

 

 

 

반응형
Posted by N'