λ°±μ—”λ“œ/Spring boot

μ›Ή μŠ€ν¬λž˜ν•‘

sh119 2024. 9. 23. 17:10

πŸ‘©‍πŸ’» μ›Ή μŠ€ν¬λž˜ν•‘μ΄λž€?

μ›Ή μ‚¬μ΄νŠΈμ˜ 데이터λ₯Ό 긁어 λͺ¨μœΌλŠ” 것을 λœ»ν•œλ‹€.

μŠ€ν¬λž˜ν•‘ μ„œλ²„ -> request (κΈ°μ‘΄ νšŒμ‚¬μ˜) μ›Ή μ„œλ²„ -> request (κΈ°μ‘΄ νšŒμ‚¬μ˜) DB
response <- response <-

 

 

βœ”οΈŽμŠ€ν¬λž˜ν•‘μ˜ ν™œμš©

μŠ€ν¬λž˜ν•‘μ€ μ‡Όν•‘λͺ°, 금육, 업무 μžλ™ν™” λ“±λ“±μ—μ„œ μ‚¬μš©λ˜λ©° λ°±μ—”λ“œ κ°œλ°œμ„ ν•˜λ©° μ›Ή μŠ€ν¬λž˜ν•‘μ„ 톡해 데이터λ₯Ό κ°€μ Έμ™€μ„œ κ°€κ³΅ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 일은 λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚œλ‹€.

νŒŒμ΄μ¬μ„ μ‚¬μš©ν•˜λ©΄ μ›Ή μŠ€ν¬λž˜ν•‘μ΄ 보닀 κ°„νŽΈν•˜κΈ° λ•Œλ¬Έμ— νŒŒμ΄μ¬μ„ 많이 μ΄μš©ν•œλ‹€.

λ‹Ήμ—°ν•˜κ²Œλ„ μŠ€ν¬λž˜ν•‘κ³Ό λ”λΆˆμ–΄ 데이터λ₯Ό μ €μž₯ν•˜λŠ” DB와 API섀계 λ˜ν•œ μ–΄λ–€ ν˜•νƒœλ‘œ κ°œλ°œν•΄μ•Ό νš¨μœ¨μ μΌμ§€ μƒκ°ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

 

 

βœ”οΈŽμŠ€ν¬λž˜ν•‘ μˆœμ„œ

  1. μŠ€ν¬λž˜ν•‘μœΌλ‘œ 데이터 κ°€μ Έμ˜€κΈ° (HTML λ¬Έμ„œ λ°›κΈ°)
  2. μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ API개발 (λ¬Έμ„œλ₯Ό parsing(νŒŒμ‹±) ν•˜κΈ° & ν•„μš”ν•œ 데이터 μΆ”μΆœ)
  3. μ„œλ²„ λΆ€ν•˜λ₯Ό 쀄이기 μœ„ν•œ μΊμ‹œ μ„œλ²„κ΅¬μ„±

 

βœ”οΈŽμŠ€ν¬λž˜ν•‘μ‹œ μ£Όμ˜μ‚¬ν•­

μŠ€ν¬λž˜ν•‘μ‹œ 아무 μ‚¬μ΄νŠΈλ‚˜ 막 데이터λ₯Ό κ°€μ Έμ˜€λ©΄ μ•ˆλœλ‹€!!! μžμΉ«ν•˜λ©΄ νšŒμ‚¬μ˜ μ€‘μš”ν•œ μžμ‚°μΈ 데이터쀑 μ‚¬μš©ν•˜λ©΄ μ•ˆλ˜λŠ” 데이터가 μžˆμ„ 수 있고, ν•΄λ‹Ή μ›Ή μ„œλ²„μ— λΆ€ν•˜λ₯Ό μΌμœΌν‚¬ 수 있기 λ•Œλ¬Έμ΄λ‹€.

그럼 μ‚¬μš©ν•΄λ„ λ˜λŠ” λ°μ΄ν„°μΈμ§€λŠ” μ–΄λ–»κ²Œ ν™•μΈν• κΉŒ?

λ°”λ‘œ robots.txt에 μ ‘μ†ν•˜μ—¬ /Disallow μ²˜λ¦¬κ°€ λ˜μ–΄ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 확인해보면 λœλ‹€!

(ex - finance.yahoo.com/robots.txt μ ‘μ†ν•˜μ—¬ 가져와도 λ˜λŠ” 데이터인지 확인)

 

/Disallow 밑에 μžˆλŠ” 것듀은 μ‚¬μš©ν•˜λ©΄ μ•ˆλ˜λŠ” 것듀이며

Allow 둜 λ˜μ–΄ μžˆλŠ” 것듀은 긁어와도 λ˜λŠ” 것듀이닀.

 

λ¬Όλ‘ , Allow μ²˜λ¦¬κ°€ λ˜μ–΄ μžˆλ‹€κ³  ν•΄μ„œ κΈ°μ‘΄ μ„œλ²„μ— 무리가 갈만큼 데이터λ₯Ό μš”μ²­ν•˜λ©΄ μ•ˆλœλ‹€.

λ˜ν•œ λ‹€λ₯Έ 것듀도 robots.txt에 μ •μ˜λœ κ·œμΉ™μ„ μ€€μˆ˜ν•œλ‹€.

 

 

βœ”οΈŽμŠ€ν¬λž˜ν•‘ ν•˜κΈ°

  1. HTMLμ—μ„œ μ›ν•˜λŠ” 데이터λ₯Ό μΆ”μΆœ
    1. μ‚¬μš©ν•˜λ €λŠ” 데이터λ₯Ό κ·Έλ €μ£ΌλŠ” μ›Ή μ‚¬μ΄νŠΈ λ‚΄μ—μ„œ νŽ˜μ΄μ§€ 우클릭
    2. κ²€μ‚¬ν•˜κΈ°
    3. element(μš”μ†Œ) 선택
  2. jsoup implement ν•΄μ£ΌκΈ° (Spring boot μ‚¬μš©μ‹œ)
implementation 'org.jsoup:jsoup:1.18.1'

 

  3. jsoup API μ°Έκ³ ν•˜μ—¬ μ½”λ“œμ§œκΈ° (μ•„λž˜λŠ” 참고용 μ˜ˆμ‹œ)

// μŠ€ν¬λž˜ν•‘ μ˜ˆμ‹œ (클래슀 등은 λ”°λ‘œ 섀정해야함)
		try {
        // ν•„μš”ν•œ 데이터 κ°€μ Έμ˜€κΈ°
			Connection connection = Jsoup.connect("https://finance.yahoo.com/quote/COKE/history/?frequency=1mo&period1=99153000&period2=1725793919");
			Document document = connection.get();


			// νŒŒμ‹± & 데이터 μΆ”μΆœ
			Elements tbody = document.getElementsByTag("tbody");

			for(Element ele : tbody){
				Elements eles = ele.getElementsContainingOwnText("dividend").parents();
				System.out.println(eles);
			}


		} catch (IOException e) {
			throw new RuntimeException(e);
		}

 

 

βœ”οΈŽ jsoup API 정리 μ°Έκ³ ν•˜κΈ°

https://jsoup.org/apidocs/ μ—μ„œ jsoup API μ •λ¦¬λ˜μ–΄ μžˆλŠ” 것을 λ³Ό 수 μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή μ‚¬μ΄νŠΈμ—μ„œ ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œ 확인 ν›„ κ°œλ°œν• λ•Œ μ‚¬μš©

 

-> μ‚¬μ΄νŠΈ 접속 ν›„ class jsoup 클릭 -> connection λ©”μ†Œλ“œ μ‚¬μš©λ°©λ²• λ“± 확인 κ°€λŠ₯

(ex) connection.get(); connection.post() λ“±..

 

(cf) DocumentλŠ” Elementλ₯Ό 상속 받은 ν΄λž˜μŠ€μ΄λ―€λ‘œ Element의 λ©”μ†Œλ“œλ“€μ„ λ‹€ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€***

 

 

 

μŠ€ν¬λž˜ν•‘ν•˜λŠ” 방법은 같은 μ‚¬μ΄νŠΈμ—¬λ„ ꡬ쑰가 λ°”λ€Œλ©΄ 방법이 μ‘°κΈˆμ”© λ‹¬λΌμ§ˆ 수 밖에 μ—†λ‹€.

λ”°λΌμ„œ μŠ€ν¬λž˜ν•‘μ‹œ HTMLꡬ쑰에 μ§‘μ€‘ν•˜μ—¬ κ³΅λΆ€ν•˜κΈ° λ³΄λ‹€λŠ” 데이터λ₯Ό νŒŒμ•…ν•˜κ³ , λΆ„μ„ν•˜λŠ” κ²½ν—˜μ„ ν•΄λ³΄λŠ” 것이 μ€‘μš”ν•˜λ‹€!