JSoup 라이브러리를 이용한 크롤링

Structure of Knowledge·2021년 2월 11일
0

Spring MVC Exercise #2

목록 보기
3/6

JSoup 라이브러리, Spring에서 사용하기

  1. 프로젝트의 pom.xml에 JSoup 라이브러리를 등록한다.
	<!-- JSoup -->
	<dependency>
	    <groupId>org.jsoup</groupId>
	    <artifactId>jsoup</artifactId>
      	    <version>1.11.2</version>
	</dependency>
  1. JSoup API : https://jsoup.org/

    1) html문서를 url을 연결해 불러온다

    2) 태그 요소를 찾아서 원하는 데이터를 뽑아온다.

    3) 태그 요소 찾는 법은 getElementBy**() 메소드를 이용하거나 css 선택기 문법과 비슷한 select() 메소드를 이용한다. https://jsoup.org/cookbook/extracting-data/selector-syntax

Final PJ (웹사이트 구현 프로젝트)

  1. 알라딘 API에서 기본적인 정보를 받아오고, 그 중 상품아이디를 이용해 상품페이지에서 책소개와 저자소개 등의 데이터를 크롤링하려고 계획함.

  2. 알라딘 상품페이지의 책소개 부분을 크롤링하려 했으나 막혀있는지 뽑아 오지 못했음.

  3. 다른 사이트의 상품리스트에서 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()); 		// 책소개
	}

  1. 위의 로직을 JUNIT을 통해 테스트 해봤는데, 웹에서 데이터베이스를 계속 갱신하지않기 때문에, 웹 어플리케이션에서 이 부분을 실행할 필요는 없다. 웹 어플리케이션과 별개로 이 로직을 실행하여 DB에 입력하려한다.
profile
객체와 제어, 비전공자 개발자 되기

0개의 댓글