크롤링 핵심 가이드라는 책을 읽으면서 크롤링된 데이터에서 필요한 정보를 추출하는 '스크레이핑'에 대해 추출 방법을 정리해 본다.
정규표현식
html내부의 모든 a태그를 추출 하는 표현식
<a.*>.*?</a>
자바의 java.util.regex.Pattern클래스로 정규 표현식을 사용할 수 있다.
String html = ....
//a 태그를 추출하기 위한 정규 표현
Pattern regex = Patten.compile("<a.*>.*?</a>");
//Matcher 객체 생성
Matcher matcher = regex.matcher(html);
//정규표현식에 일치하는 부분은 콘솔에 출력
while(matcher.find()) {
System.out.println(matcher.group());
}
XPath
XPath는 XML의 특정 요소를 추출하기 위한 쿼리를 의미한다. XML의 계층 구조를 경로로 표현해 추출할 요소를 지정할 때 사용.
XML예
<?xml version="1.0" ?>
<books>
<book>
<title>크롤링</title>
<publisher>위키북스</publisher>
</book>
....
</books>
타이틀이 '크롤링' 인 책을 낸 출판사를 추출
/books/book[title/text()='크롤링']/publisher
xml파일을 읽는다.
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new File("books.xml"));
//XPath 사용 준비를 합니다.
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
//publisher 요소를 추출하기 위한 XPath를 생성
XPathExpression expr = xpath.comile("/books/book[title/text()='크롤링']/publisher");
//publisher 요소를 추출하기 위한 XPath를 생성
Object result = expr.evaluate(doc, XPathConstants.NODE);
Element element = (Element)result;
System.out.println(element.getTextContent());
CSS선택자
CSS란 Cascading Style Sheets의 약자로 HTML, XHTML, XML과 같은 마크업 문서의 외관을 표현할 때 사용하는 형식이며 HTML은 문서의 구조를 표현할 때 사용하는 것이고 CSS는 그러한 문서의 외관을 표현할 때 사용하는 것이라고 구분하면 좋다. 현재 CSS3까지 권고된 상태.
h1 {
font-size:180%;
color:red;
}
div.content {
padding:10px;
color:gray;
}
CSS선택자는 a처럼 단순하게 요소를 선택하는 것도 있고, div > a (div 요소 바로 아래에 있는 a요소)처럼 부모 자식 관계를 선택하는 것도 있다.
다양한 선택자가 있는데 우선 기본적인 선택자는 다음과 같다.
* : 모든 요소를 선택, 전체 선택자, 유니버셜 선택자라고 하는데 참고로 #id는 *#id, *.not(selector)는 :not(selector)와 같은 의미다.
E : 요소를 나타낸다. (예 : div )
#id : id속성을 지정. (예 : #content )
.class : class속성을 지정. .contents.detail-a 처럼 결합하면 여러 개의 class속성을 지정할 수 있다. (예 .article )
결합자
E F : E의 후손에 있는 F를 나타낸다. (예: div.labels span)
E > F : E의 자식에 있는 F를 나타낸다. (예: ul#content-list > li )
E + F : E와 이웃한 F를 나타낸다. (예: li.active + li)
E ~ F : E 뒤에 있는 F를 나타낸다. (예: h1 ~ div)
이 외에도 속성선택자, 유스 클래스 선택자 등이 있다. 자바 언어를 사용해 크롤링을 하고 스크레이핑을 할때에는 경험상 Jsoup이라는 라이브러리를 사용하는 것이 가장 바람직해 보인다. 다양한 선택자를 사용할 수 있고 유연하고 사용 방법도 직관적이다.
따라서 베이스가 되는 기본 개념은 HTML + CSS , DOM에 대한 학습을 한 수 HTML을 크롤링해서 데이터를 추출하는 기술은 경험적으로 습득하면 될 것 같다.
'프로그래밍 > Java' 카테고리의 다른 글
Java프로그램 안에서 jar파일 실행하기 (0) | 2019.01.15 |
---|---|
java main(String[] args) 의 args 살펴보기 (0) | 2019.01.15 |
여러가지 줄바꿈 코드(CR , LF) (0) | 2018.12.27 |
Spring AOP(Aspect Oriented Programming) (0) | 2018.12.21 |
Java String to JSON (0) | 2018.12.14 |