반응형
11-08 05:45
Today
Total
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
관리 메뉴

개발하는 고라니

[Java] 'Jsoup'을 이용한 Java 크롤링 본문

Languages/Java

[Java] 'Jsoup'을 이용한 Java 크롤링

조용한고라니 2020. 12. 14. 16:13
반응형

* '코드로 배우는 스프링 웹 프로젝트' 교재를 1.5회(?) 완독 후, 스스로의 힘으로 게시판을 구현해보았다.

물론 미흡한 점이 심심찮게 발견되어 수정의 수정을 거듭했다. 그렇게 3~4주를 보내고 나니 다음엔 무엇을 만들어볼까 하던 차에, 문득 떠오른 것이 있다.

 

'무수히 많은 치킨 가게가 있고, 그 많은 메뉴들을 한 곳에서 모아보면 어떨까?'

 

 그래서 프로젝트라고 하기엔 뭣하지만 원하는 작업을 구현해보며 모르는 부분이 있으면 배워가고, 알던 내용이 있으면 다시 되새기는 목적을 가지고 시도해보려 한다.

 

 먼저 '푸라닭' 사이트에서 메뉴 정보들을 크롤링해 뿌려주는 식으로 시작해보고 결과가 괜찮으면 다른 브랜드들도 시도해보는 식으로 점차 넓혀가겠다.

 


* 개발에 있어 맨 땅에 헤딩을 할 땐 어디서 부터 시작을 해야할지 막막하다. 우선 이 포스트의 제목이 크롤링이니 크롤링을 구현하는 것 부터해보자. 보통 크롤링 하면 Python으로 하는 크롤링이 가장 먼저 떠오르지만, Java로 할 수도 있으니 시도해보자.

 

크롤링(Crawling) 이란?

  • 인터넷에 데이터가 방대해졌고, 그것들을 활용할 필요성이 높아졌다. 그런 정보들을 분석하기 쉽고 활용하기 쉽게 데이터를 수집하는 행위를 크롤링이라 하고, 크롤링 하는 프로그램을 크롤러(Crawler)라고 한다.
  • 원하는 데이터를 추출하는 스크래핑(Scraping)과 개념이 혼동되기도 하는데, 사실 크롤링의 정확한 정의는 다양한 웹사이트의 페이지를 브라우징하는 작업을 말한다. 하지만 정보를 수집하기 위해 브라우징만 하지 않는다. 페이지 내에 있는 데이터를 추출해서 가공하는 것이 최종 목표이다.
  • 결론적으로 크롤링 -> 스크래핑의 과정으로 넘어간다. 그래서 이 두가지 개념이 혼용된다고 할 수 있다. 해외에서는 크롤링보단 스크래핑이라고 주로 쓴다고 한다.

 

# 크롤링을 위한 라이브러리 추가 

* 자바 크롤링을 구글링 하면 대부분 'Jsoup'을 많이 사용하므로 이를 이용해보자.

 Maven Repository에 'Jsoup'을 검색하면 나온다.

 이를 pom.xml <dependencies> 태그 밑에 추가하자.

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>

Maven or Gradle을 사용하지 않는다면 jsoup.org/download 에서 jsoup-1.xx.x.jar 파일을 다운받아서,

 

이클립스에서 프로젝트 우클릭 -> Build Path -> Configure Build Path -> Add External JARs

 

다운받은 .jar을 추가해주면 된다.

# 크롤링을 위한 Class

* 추후 푸라닭뿐 아니라 타브랜드들도 크롤링하고 DB에 저장할 수 있으므로 클래스의 재사용을 생각한다. Crawler 인터페이스를 만들고 각 브랜드별 크롤러 클래스는 Crawler 인터페이스를 상속하며 Application 클래스에서 크롤러 클래스를 사용하는 방식으로 한다.

 

* 먼저 치킨의 목록리스트를 생성할 생각이고, 푸라닭 홈페이지를 보면 다음과 같이 되어있다.

* 다음은 HTML의 일부분이다.

* <ul> ---> <li>태그 내부에 치킨메뉴에 대한 내용을 리스트로 담아둔 형태이다.

 

 

# Crawler 인터페이스

# PuradakCrawler 클래스

* 1. <ul class="list">를 통째로 가져와서 Elements elements라는 객체를 만들어 대입한다.

 

* 2. elements는 <ul> 밑의 모든 <li>태그를 가지고 있으므로, <li>태그의 자식 노드들 까지 접근할 수 있다. 따라서 메뉴이름을 갖고있는 <p class="title one">태그를 가져와 Iterator에 담는다.

 

* 3. Iterator를 순회시키며 콘솔에 메뉴 이름들을 찍어보자.

 

 

# Application 클래스

# 실행결과

 

* 각 페이지가 담고있는 치킨 메뉴들의 이름을 잘 출력해주었다. 다음 포스팅에서는 Oracle을 이용해 DB Table을 만들고 치킨 메뉴의 이름을 insert해보는 시간을 갖는다.

반응형

'Languages > Java' 카테고리의 다른 글

[Java] 클래스와 객체  (0) 2021.03.01
[Java] 우선순위 큐(Priority Queue)  (0) 2021.01.28
[Java] 람다식  (0) 2021.01.26
[Java] StringTokenizer  (0) 2021.01.23
[Java] Stream  (0) 2020.12.30
Comments