Crawling, Scrapping… 갑자기 뭔 신기술처럼 대접받는

요즘 갑자기 신기술처럼 포장되는 것 중 하나
그냥 Html파싱, 퍼오기라고 생각해서 이력서에도 굳이 안 쓰는데
시시콜콜하게 다 써놔야하나 하는 생각이 든다.
별것 아니고 계속 사용되어 왔지만 갑자기 주목받는 기술 중 하나

Crawling, Scrapping을 구분해보면

구분 할 필요가 있긴한지 잘 모르겠지만… 굳이 구분해서 쓰는 사람이 있을지 모르니 알아두자
혼용되서 사용되기도 하고.. 굳이 구분하기도 하는데 이게 맞는지 정확하지는 않다.

Crawling

웹사이트를 걍 다 퍼오는 개념으로
링크를 타고 다음링크를 다시 타고들어가는 기능(Spider)이 중요하다.
한 주소를 가지고 거기있는 링크를 타고타고 또 들어가야 하는데 이것을 꼼꼼히 구현하는게 생각보다 힘들다. depth가 많아질수록…  이 부분은 Nutch, Scrapy 같은 라이브러리에서 지원을 해 주니 굳이 따로 구현을 할 필요는 없다.

Scrapping

스크래핑은 .. 사실 그냥 파싱 아닌가
특정 웹페이지에서 원하는 데이터를 뽑아내는 기술이다.

웹페이지를 만들 때 구조적으로 만드는게 구현도 더 쉽기 때문에 html의 id, class에는 보통 패턴이 숨어있다. 이걸 찾아서 데이터를 찾아오게 코딩을 해 주면 된다.
가끔 막코딩된 페이지는 별 수 없다. 막파싱 해야한다 .dom 계층을 무식하게 따라가면
노가다는 승리한다.

이런식으로 특정 사이트를 정해놓고 원하는 데이터를 뽑아내는 것은 쉽다.

카톡, 블로그, 페북도 요즘 이런걸 지원한다. 글쓰기 창에 링크를 박으면 해당 주소의 대표이미지와 요약정보를 보여주는데 보통 Meta데이터에 포함된 정보를 보여준다.
여기서, Meta데이터가 없을 경우에 알아서 정보를 표현 해 주는 기능을 만들려면 머리가 좀 아플거다.
(아직까지 알아서 잘 되는건 못 봤다)

여기서도 BeautifulSoup, Jsoup, Gson 등 각 언어별로 Html, Xml 라이브러리가 있으니 갖다 쓰자.

JS를 이용해 데이터가 다이내믹하게 변하는 웹사이트는 좀 다른 노력이 필요하다.
Ajax,Websocket, AngularJS등을 이용하는 페이지는 그냥 HTML을 다운받아 파싱하면 뻘 데이터가 나온다. 이럴 때는 WebDriver를 써야한다.
파싱은 python의 Selenium라이브러리를 이용해서 phantomJS 드라이버를 사용하면 편하다. 이렇게 하면 브라우저로 보는것과 HTML을 얻을 수 있다.
참고로.. 암표 봇이나 수강신청 봇도 이런기술을 이용해서 만들면 된다.(IP차단당할수도있다)

사용법은 공식사이트에서

http://phantomjs.org/
http://www.seleniumhq.org/
https://www.crummy.com/software/BeautifulSoup/
https://scrapy.org/
http://nutch.apache.org/

구석구석 잘 알고 쓰면 좋지만… 간단한 기능을 만드는데 모든 기능을 이해할 필요는 없다.
그래도 기술의 구조와 개념정도는 이해하고 쓰는게 좋은 것 같다.

Nutch 2.0 Eclipse에서 돌리기 Maven이용

참고사이트
http://foreblue.net/wiki/index.php/Nutch_%EC%B4%88%EA%B0%84%EB%8B%A8_%EB%B9%8C%EB%93%9C%EC%99%80_%EC%8B%A4%ED%96%89
http://foreblue.net/wiki/index.php/Nutch_%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD%EA%B5%AC%EC%84%B1

<build>
<resources>
<resource>
<directory>conf</directory>
</resource>
</resources>
......

1.5인거 1.6으로 수정...
</build>

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.15</version>
	<exclusions>
<exclusion>
<artifactId>jms</artifactId>
<groupId>javax.jms</groupId>
</exclusion>
<exclusion>
<artifactId>jmxtools</artifactId>
<groupId>com.sun.jdmk</groupId>
</exclusion>
<exclusion>
<artifactId>jmxri</artifactId>
<groupId>com.sun.jmx</groupId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>

넛츠 개발자넘들은 도대체 뭘로 개발하는건지 모르겠다. 메이븐이 제대로 안 돌아간다.

먼저 위에 써놓은 부분처럼 pom.xml을 수정해줘야한다.

기타 의존성 문제는 에러메세지를 보면서 추가하면 금방 해결된다. 사람마다 다른 메세지가 뜰테니…

 

2.넛츠 튜토리얼에 있는것처럼 추가한다.

http://wiki.apache.org/nutch/NutchTutorial

nutch-site.xml.template로 돼 있는파일 nutch-site.xml로 변경 후 튜토리얼 보고 셋팅하고

regex-urlfilter.txt요곳도 변경

 

3. 실행설정

이클립스 java 실행 설정

org.apache.nutch.crawl.Crawler
urls -dir crawl -depth 3 -topN 50
-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

4.

 

 

 

 

 

 

 

 

 

Nutch 2.0 Eclipse에서 돌리기 Ivy이용

일단 구동까지 성공과정이다.
http://wiki.apache.org/nutch/RunNutchInEclipse
http://techvineyard.blogspot.kr/2010/12/build-nutch-20.html#Datastores
https://issues.apache.org/jira/browse/NUTCH-970
http://foreblue.net/wiki/index.php/Nutch_%EC%B4%88%EA%B0%84%EB%8B%A8_%EB%B9%8C%EB%93%9C%EC%99%80_%EC%8B%A4%ED%96%89
http://foreblue.net/wiki/index.php/Nutch_%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD%EA%B5%AC%EC%84%B1

이 세 포스팅을 순서대로 보고 따라하면 나와 같은 결과까지는 얻을 수 있을 것 같다.아마도..
구동환경 mac lion, sts2.92, mysql 5.5

https://svn.apache.org/repos/asf/nutch/trunk
에서 코드를 받는다.
현재 시점에서 trunk에는 2.0이 아닌 1.6버전으로 표시가 되어 있고 아주 최신버전은 branch의 2.x였다. 그래서 그걸 받았다.
revision 1366348

maven으로 임포트하면 의존성이 제대로 처리가 안된다. pom파일만 가지고 한참 씨름을 해야한다.

!! 프로젝트 우클릭 > Configure > Convert to Maven Project
이 명령으로 폴더를 자동으로 잡아주는것까지만 처리한다.

!! 그리고 메이븐취소하고 프로젝트 우클릭 > Configure > Add ivy dependency management
!! conf 폴더는 자동으로 추가가 안된다. 수동으로 클래스패스에 추가한다. 그리고 맨 위로 올려놓는다.(이건 꼭 안해도 되는데 해야 에러가 덜난다고한다)

!! ivy.xml 우클릭 add library

!! build.xml 앤트 컴파일

!! run 설정
클래스 : org.apache.nutch.crawl.Crawl
Program Arguments : urls -dir crawl -depth 3 -topN 50
VM arguments : -Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log

여기서 실행! 하면 당연히 안돌아간다.

http://wiki.apache.org/nutch/NutchTutorial
!! conf에 있는 파일들에 터미널에서 실행할 때 설정해주는 부분 다 셋팅해준다. urls도 해주고 이것저것….

아직도 더 남았다.
지금 실행시키면 고라 어쩌고저쩌고 에러가 날거다.
한참 찾아봤는데… 넛치의 코드에 hsql을 실행시켜주는 코드가 없는 것 같다.
그래서 컴퓨터에 깔려있는 mysql과 연결시켰다.

!! gora.properties mysql connection string 설정, ivy 의존성파일에 주석쳐있는 mysql 부분을 봉인해제해준다.

아직도 안된다.
utf8-general-ci로 해놓으면 안된다고한다. Gora에 있는 버그인것같다.
이것도 수정

!! crawl폴더가 없다는 오류 발생

프로그램은 돌아간다.
근데 수집을 하지는 않는다. 설정이 머가 잘못된걸까?