<!-- JSoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
JSoup API : https://jsoup.org/
1) html문서를 url을 연결해 불러온다
2) 태그 요소를 찾아서 원하는 데이터를 뽑아온다.
3) 태그 요소 찾는 법은 getElementBy**() 메소드를 이용하거나 css 선택기 문법과 비슷한 select() 메소드를 이용한다. https://jsoup.org/cookbook/extracting-data/selector-syntax
알라딘 API에서 기본적인 정보를 받아오고, 그 중 상품아이디를 이용해 상품페이지에서 책소개와 저자소개 등의 데이터를 크롤링하려고 계획함.
알라딘 상품페이지의 책소개 부분을 크롤링하려 했으나 막혀있는지 뽑아 오지 못했음.
다른 사이트의 상품리스트에서 itemId를 추출하고, 이를 이용해 상품페이지에서 필요한 데이터를 추출함.
@Test
public void getItemId() { // 책 리스트 페이지에서 책고유번호를 추출한다.
Document doc = null;
String url = "https://..../category/books/100?order=selling&page=10";
try {
doc = Jsoup.connect(url).get();
} catch (IOException e) {
e.printStackTrace();
}
Elements items = doc.select("div.book_thumbnail > a");
for(Element item: items) {
String href = item.attr("href");
String[] temp = href.split("/");
String itemId = temp[2];
log.info(itemId); // getItemInfo(itemId)를 호출.
}
}
@Test
public void getItemInfo() { // itemId를 이용해 그 상품의 정보를 추출한다.
Document doc = null;
String url = "https://..../books/1648000309";
try {
doc = Jsoup.connect(url).get();
}catch(IOException e) {
e.printStackTrace();
}
Elements metaTags = doc.select("meta[property]");
for(Element meta: metaTags) {
if(meta.attr("property").equals("og:title")){
log.info(meta.attr("content"));
}
if(meta.attr("property").equals("og:image")){
log.info(meta.attr("content"));
}
if(meta.attr("property").equals("books:rating:value")){
log.info(meta.attr("content"));
}
}
log.info(doc.selectFirst("p.metadata.metadata_writer").text()); // 저자
log.info(doc.selectFirst("a.publisher_detail_link").text()); // 출판사
log.info(doc.selectFirst("tr.selling_price_row > td.book_price").text()); // 가격
log.info(doc.selectFirst("div #introduce_book > p").text()); // 책소개
}