๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์—”๋“œ/Spring boot

์›น ์Šคํฌ๋ž˜ํ•‘

by sh119 2024. 9. 23.

๐Ÿ‘ฉ‍๐Ÿ’ป ์›น ์Šคํฌ๋ž˜ํ•‘์ด๋ž€?

์›น ์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธ์–ด ๋ชจ์œผ๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

์Šคํฌ๋ž˜ํ•‘ ์„œ๋ฒ„ -> 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๊ตฌ์กฐ์— ์ง‘์ค‘ํ•˜์—ฌ ๊ณต๋ถ€ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ๋ถ„์„ํ•˜๋Š” ๊ฒฝํ—˜์„ ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค!