이번 포스팅에서는 크롤링의 개념과 방법에 대해 기초적인 부분만 다루어보았다.
1. What?
: 웹 크롤링이란, web상을 돌아다니며 필요한 정보를 수집하는 것이다. 이때 정보를 수집하는 것은 물론 데이터를 가공하여 필요한 정보만을 사용할 수 있도록 text화 하는 것도 중요하다. 자세하게는 아래의 키워드와 설명을 통해 알 수 있다.
1) 스크래핑 : 수집
- 인터넷상에 존재하는 데이터를 프로그램을 이용해서 자동화된 방법으로 해당 데이터를 수집하는 작업
- 웹에서 데이터를 수집하는 작업
2) 크롤링 : 수집 및 분류
- 수집한 데이터를 분류
- 주로 인터넷의 웹페이지를 수집해서 분류하고 저장하는 작업
- 데이터가 어느 위치에 저장되어 있는지 작성하는 작업이 포인트이다. (접근에 초점)
3) 파싱 : 가공
- 받아온 웹페이지의 데이터를 이용할 형식에 맞게 추출하여 의미있는 값으로 변형하는 작업
- 사용하는 언어(문법)에 맞게 분석하는 작업이 포인트다. (가공에 초점)
일반적으로 스크래핑과 크롤링을 구분 없이 혼용하여 사용한다.
4) DOM (Document Object Model)
- 크롤링을 하기 위해서는 DOM의 분석이 필수이다.
- html, xml을 tree형식으로 구조화한 형태를 DOM이라고 하며, 문장의 이해를 도울 수 있도록 하단에 사진을 첨부하였다.
- <> : 태그, 요소, element
- <>안의 갈색글씨 : 속성(주로 id, class)
- Jsoup : 자바로 이루어진 HTML Parser.HTML로 이루어진 데이터(주로 요소)를 분석가능
2. How?
: 만약 네이버 웹툰의 장르별 추천웹툰의 제목을 가져오고 싶다면 그 방법은 아래와 같다.
package class06;
import java.io.IOException;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test01 {
public static void main(String[] args) {
// 0. 크롤링 할 url 상수화작업
// = 데이터를 수집할 화면 url
final String url = "https://comic.naver.com/index";
Document doc = null;
try {
//1. url의 소스코드를 get : 스크래핑
// stmt와 비슷한 맥락이다.
doc = Jsoup.connect(url).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 이때, Document는 수행 결과물로, Jsoup을 통해HTML 전체 문서를 받아온다!
// 2. "doc에 담긴 url의 일부만 보고싶어" : 스크래핑한 데이터를 크롤링!
// select()의 output이 여러 요소들임을 확인 가능
Elements eles = doc.select("div.genreRecomInfo2 > h6");
// 3. 출력
Iterator<Element> itr = eles.iterator();
while(itr.hasNext()) {
System.out.println(itr.next().text());
}
}
}
* 주석 2번 *
: genreRecomInfo2라는 이름을 가진 div클래스의 h6요소에는 내가 원하는 정보, title(책제목)이 포함되어있다. 그것을 긁어와 java에서 출력시키는 작업이다.
[출력결과]
휴재 컷툰 숏애니 중독연구소
휴재 컷툰 숏애니 히어로메이커
휴재 컷툰 숏애니 결혼생활 그림일기
휴재 컷툰 숏애니 내일
휴재 컷툰 숏애니 굿 리스너
휴재 컷툰 숏애니 무서운게 딱좋아!
* 가공 *
: 분명 더 세세하게 들어가 정보를 긁어온다면 제목만을 출력할 수 있겠지만, 가공을 통해 제목만 출력할 수 있도록 하였다.
// 3. 출력
Iterator<Element> itr = eles.iterator();
while(itr.hasNext()) {
// 4. 파싱 : 가공작업
String str = itr.next().text();
System.out.println(str.substring(10)); //앞에서 10칸 cut
}
"휴재 컷툰 숏애니 " : 10칸을 삭제하면 아래와 같이 출력이 가능하다.
[출력화면]
트리거
착한건 돈이된다
드로잉 레시피
싸이코 리벤지
꿈의 기업
소녀의 세계
3. 예제
: 지니뮤직에서 최신 음악 중 노래 제목만 가져와 출력하기
package class06;
import java.io.IOException;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test02 {
public static void main(String[] args) {
// 0. 크롤링 할 url 상수화작업
final String url = "https://www.genie.co.kr/newest/song";
Document doc = null;
try {
//1. url의 소스코드를 get : 스크래핑
doc = Jsoup.connect(url).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 2. "doc에 담긴 url의 일부만 보고싶어" : 스크래핑한 데이터를 크롤링!
Elements eles = doc.select("tr.list > td.info > a.title");
// 3. 출력
Iterator<Element> itr = eles.iterator();
while(itr.hasNext()) {
System.out.println(itr.next().text());
}
}
}
* 주석 2번 *
: a class의 요소인 title < info라는 이름을 가진 td클래스 < list라는 이름을 가진 tr클래스
[출력결과]
RICA RICA
Feelin' Like
Hangover (Feat. Mckdaddy)
NFT (With ONEO)
오랜만이야
우리가 다시 만날 수밖에 없는 이유 (Prod. by 남혜승)
1분에 한 번
Good Night (Feat. BE'O)
(이하 생략)
.
.
가장 외부의 집합인 포장지를 하나씩 풀어가며 내가 원하는 정보까지 도달했을때, 그 정보가 어디에 속하여있는지를 분석하는 방식으로 접근하면 이해가 쉽다.
'DBMS' 카테고리의 다른 글
[Oracle] 프로젝트의 설계 & 두개의 TableDB (0) | 2022.01.26 |
---|---|
[Oracle] 웹크롤링_샘플데이터처리 (0) | 2022.01.25 |
[Oracle] 트랜잭션 (0) | 2022.01.22 |
[Oracle] pstmt (0) | 2022.01.21 |
[Oracle] DB접근&MVC분리 (0) | 2022.01.20 |