๋ฐ์—”์œผ๋กœ ์„ฑ์žฅ์ค‘ ๐ŸŒฑ

Python/[๊ธฐ์ดˆ ๊ฐ•์˜ ์ •๋ฆฌ]

python ๊ธฐ์ดˆ 3

์จ๋ฐ 2023. 2. 24. 15:40

โœ๐Ÿป ๋ฐฐ์šด์ 

 

๊ฐ€์ƒ ํ™˜๊ฒฝ ์„ธํŒ… ๋ฐฉ๋ฒ•๊ณผ ์–ด๋–ป๊ฒŒ ํŒŒ์ด์ฌ์œผ๋กœ ํด๋”์™€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํŠนํžˆ, ํฌ๋กค๋ง์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด๋ฉฐ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

 

 


 

 

 

๋“ค์–ด๊ฐ€๋ฉฐ

 

์ฝ”๋“œ ์˜ˆ์ œ๋“ค์€, ๋„ค์ด๋ฒ„ Vibe ํฌ๋กค๋ง์„ ์˜ˆ์‹œ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

 

๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ์‹œ, ํŒจํ‚ค์ง€ ์„ค์ •ํ•˜๊ธฐ

 

ํŒจํ‚ค์ง€๋“ค์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— requirements.txt ๋ผ๋Š” ํŒŒ์ผ์— ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, github ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ,

requirements.txt ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ

 

pip install -r requirements.txt

 

๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์šดํ•œ ์†Œ์Šค ์ฝ”๋“œ์˜ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฒ„์ „์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

 

 

pip list

๋ฅผ ํ†ตํ•ด ์„ค์น˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ์ €์žฅํ•˜๊ธฐ

 

 

pip list --format=frezee > requirements.txt

 

๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(๋ฆฌ๋””๋ ‰์…˜)

 

์œ„์—์„œ ์‚ฌ์šฉํ•œ > ๊ธฐํ˜ธ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(ํ˜น์€ ๋ฆฌ๋””๋ ‰์…˜) ์—ฐ์‚ฐ์ž๋กœ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

 

์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…๋ น ์…ธ์—์„œ ์ž…์ถœ๋ ฅ์„ ์‰ฝ๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ง์ ‘ ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€์„œ ์‹คํ–‰ํ•  ํ•„์š” ์—†์ด ์งง์€ ์ฝ”๋“œ๋กœ ํŒŒ์ผ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด ์œ ์šฉํ•˜๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด,

 

echo "hello" > a.txt

 

 

์ด๋ ‡๊ฒŒ > ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— ์ž‘์—… ๊ฐ€๋Šฅํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๋ฉด ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

 

 

 

 

 

์ƒˆ๋กœ์šด ํด๋” ์ƒ์„ฑ ๋ฐ ํŒŒ์ผ ์ €์žฅํ•˜๊ธฐ

 

 

import os

if not os.path.isdir("์ €์žฅ ๊ฒฝ๋กœ/์›ํ•˜๋Š” ํด๋”๋ช…"):
	os.mkdir("์ €์žฅ ๊ฒฝ๋กœ/์›ํ•˜๋Š” ํด๋”๋ช…")

 

ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ๋กœ์— ๋งŒ๋“ค๊ณ  ์‹ถ์€ ์ด๋ฆ„์˜ ํด๋”๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์— ํด๋”๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

with open("์ €์žฅ ๊ฒฝ๋กœ/ํŒŒ์ผ ์ €์žฅํ•  ํด๋”๋ช…/" + "ํŒŒ์ผ ์ด๋ฆ„ ์ €์žฅ ๋ฐฉ์‹ ๋ฐ ํ˜•์‹", "w", encoding='utf-8-sig') as f:
	f.write(ํŒŒ์ผ์— ์ž‘์„ฑํ•  ๋‚ด์šฉ)

 

 

๊ทธ๋ฆฌ๊ณ  ์ €์žฅ ๊ฒฝ๋กœ ๋ฐ ์ €์žฅํ•  ํด๋”๋ช…๊ณผ ์ €์žฅํ•  ํŒŒ์ผ์˜ ์ด๋ฆ„ ํ˜•์‹์„ ์ง€์ •ํ•ด์ฃผ๊ณ , ํŒŒ์ผ์— ์ž‘์„ฑํ•  ๋‚ด์šฉ์„ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ๊ฐ€ ์œ„์น˜ํ•œ ํด๋”์— ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

webdriver & selenium

 

์šฐ๋ฆฌ๊ฐ€ ํฌ๋กค๋ง์„ ์ง„ํ–‰ํ•  ๋•Œ, ์ฃผ๋กœ requests ๋ฅผ import ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ํŠน์ • ์›น ํŽ˜์ด์ง€๋“ค์€ ์ด๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ์ด ์–ด๋ ต๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

๊ทธ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ selenium ์ด๋‹ค.

 

selenium ์€ ์›น ์‚ฌ์ดํŠธ์˜ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ, ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งˆ์น˜, ์›น ํŽ˜์ด์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ˆ„๋ฅธ ๊ฒƒ ์ฒ˜๋Ÿผ ์ง์ ‘ ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ž‘ํ•˜๋ฉฐ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.

(์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋ณด๋Š” ๋„ค์ด๋ฒ„ ์นดํŽ˜ ๊ธ€ ๋„๋ฐฐ ๊ฐ™์€ ๊ฒƒ๋„ selenium ์„ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งˆ์„ธ์š”...!)

 

from selenium import webdriver

 

selenium ์€ webdriver ๋ฅผ import ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, webdriver ๋Š” ๋ธŒ๋ผ์šฐ์ € ์ œ์–ด์— ํ•„์š”ํ•˜๋‹ค.

 

๋‚ด๊ฐ€ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๋กœ ๋™์ž‘ํ• ์ง€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์–ด๋–ค ์‚ฌ์ดํŠธ์—์„œ๋Š” requests ์˜ ์ ‘๊ทผ์„ ๋ง‰๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ ์›นํŽ˜์ด์ง€์—์„œ ํด๋ฆญํ•˜๊ณ  ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์†์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

 

driver = webdriver.Chrome()

 

์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

driver.get("ํฌ๋กค๋ง ํ•  ๋งํฌ")

 

๊ทธ ํ›„, get ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด driver ์— ์ž์‹ ์ด ํฌ๋กค๋ง ํ•˜๊ณ  ์‹ถ์€ ๋งํฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

 

 

driver.page_source

 

๋ฅผ ์ž…๋ ฅํ•˜์—ฌ driver ๊ฐ€ ์œ„์น˜ํ•œ ์›น ํŽ˜์ด์ง€์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

BeautifulSoup(bs4)

 

ํŒŒ์ด์ฌ ํฌ๋กค๋ง์— ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ BeautifulSoup ์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

 

from bs4 import BeautifulSoup as BS

 

์ฃผ๋กœ, ์œ„์™€ ๊ฐ™์ด BeautifulSoup ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

BeautifulSoup ์˜ ๊ธฐ๋Šฅ์€, HTML ๋ฐ XML ํŒŒ์ผ ๊ฐ™์€ ๋ฌธ์„œ์—์„œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

 

driver๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ํฌ๋กค๋งํ•˜๊ณ  ์‹ถ์€ ์›น ํŽ˜์ด์ง€์˜ html ์„ ๋ฐ›์•˜๋‹ค๋ฉด, BeautifulSoup ๋ฅผ ํ†ตํ•ด html ์—์„œ ์›ํ•˜๋Š” ํŠน์ • ์ •๋ณด๋“ค์„ ๋น ๋ฅด๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

bs = BS(driver.page_source)

 

bs ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ํ˜„์žฌ driver๊ฐ€ ์œ„์น˜ํ•œ ์›น ํŽ˜์ด์ง€์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ณด์ธ๋‹ค.

(์ฐธ๊ณ ๋กœ, ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ๋กœ ๋“ค์–ด๊ฐ€ ์ƒ๋‹จ์˜ Elements ๋ฅผ ํด๋ฆญํ•˜๋ฉด html ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

 

๋จผ์ €, ๋‚ด๊ฐ€ ํฌ๋กค๋งํ•˜๊ณ  ์‹ถ์€ ์›น ํŽ˜์ด์ง€์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ BeautifulSoup ์—๊ฒŒ ๋„˜๊ธด๋‹ค.

 

 

๋„ค์ด๋ฒ„ Vibe ์—์„œ ํฌ๋กค๋ง ํ–ˆ์„ ๋‹น์‹œ 1์œ„๋ฅผ ํ•œ ๋…ธ๋ž˜์˜ ๊ฐ€์‚ฌ๋งŒ ๋Œ์–ด์™€ ๋จผ์ € ์ž˜ ์ถ”์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

bs.find("div", {"class" : "end_section section_lyrics"})

 

 

๊ทธ๋ฆฌ๊ณ , ๋‚ด๊ฐ€ ์•Œ๊ณ  ์‹ถ์€ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ณด๊ณ , ๊ทธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด find ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ๋Š”๋‹ค.

 

๋„ค์ด๋ฒ„ ๋ฐ”์ด๋ธŒ ๊ฐ™์€ ๊ฒฝ์šฐ, ๊ฐ€์‚ฌ๊ฐ€ "end_section section_lyrics" class ์˜ div ํƒœ๊ทธ์— ์žˆ์–ด ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ๊ฐ€์‚ฌ๊ฐ€ ๊ธด ๊ฒฝ์šฐ '๋”๋ณด๊ธฐ'๋ฅผ ํด๋ฆญํ•ด ์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ฐ€์‚ฌ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.

 

์ด๋•Œ, ์ด๋ฅผ ์œ„ํ•ด ์ž๋™ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ selenium ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

 

from selenium.webdriver.common.by import By
driver.find_element(By.CSS_SELECTOR, "#content > div.end_section.section_lyrics > a").click()

 

selenium ์˜ By ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์›น ํŽ˜์ด์ง€์—์„œ ์š”์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค.

 

์‚ฌ๋ฐ”์‚ฌ๊ฒ ์ง€๋งŒ, css ๋กœ ์ฐพ๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

 

By.CSS_SELECTOR ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ฐพ๊ณ  ์‹ถ์€ ๋‚ด์šฉ์ด ์žˆ๋Š” ์š”์†Œ๋“ค์„ ์ฐพ๋„๋ก driver ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  click ํ•˜๋„๋ก ํ•œ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐ€์‚ฌ ๋”๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ html ์„ ์™„์ „ํžˆ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๊ทธ ํ›„, ๋‹ค์‹œ bs ์—๊ฒŒ ํ˜„์žฌ ์œ„์น˜ํ•œ ํŽ˜์ด์ง€์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

 

 

lyrics = bs.find("div", {"class" : "lyrics"}) # ๊ฐ€์‚ฌ ์ฐพ๊ธฐ
lyrics.find("p") # p tag ์ฐพ๊ธฐ
lyrics.find("p").text # text ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ

 

 

์ˆœ์ˆ˜ํ•œ ๊ฐ€์‚ฌ๋งŒ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด, 'p' ํƒœ๊ทธ๊ฐ€ ์—†๋„๋ก text ๋กœ string ์œผ๋กœ ๋ฐ”๊พผ๋‹ค.  

 

 

 

 

 

๋„ค์ด๋ฒ„ VIBE ์ฐจํŠธ ์˜ค๋Š˜ Top 100 ๋…ธ๋ž˜ ๋ฒˆํ˜ธ ๊ฐ€์ ธ์™€ ์ €์žฅํ•˜๊ธฐ

 

 

import requests
import time
from bs4 import BeautifulSoup as BS
from selenium import webdrvier
from selenium.webdriver.common.by as By


chart = "https://vibe.naver.com/chart/total" # ๋„ค์ด๋ฒ„ vibe ์ฐจํŠธ top 100 ์›น ์ฃผ์†Œ
driver = webdrvier.Chrome() # Chrome ํŽ˜์ด์ง€๋กœ ์ ‘๊ทผ
driver.get(chart) # driver ์— ํ•ด๋‹น ์ฐจํŠธ ํŽ˜์ด์ง€ ๋„˜๊ธฐ๊ธฐ

chart_bs = BS(dirver.page_source) # bs์—๊ฒŒ ์›น ์†Œ์Šค ์ฝ”๋“œ ๋„˜๊ธฐ๊ณ  chart_bs ์— ์ €์žฅ


total = [] # ๋…ธ๋ž˜ ๋ฒˆํ˜ธ ์ €์žฅ


# ๋…ธ๋ž˜ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ๊ณ , ํ˜•์‹์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•œ ํ›„ total ๋…ธ๋ž˜ ๋ฒˆํ˜ธ list ์— ์ €์žฅ
for x in chart_bs.find("div", class_ = "tracklist").findAll("td", {"class" : "song"}):
	total.append(x.find("a")['href'].split("/")[-1])

 

 

ํฌ๋กค๋ง์„ ํ†ตํ•ด ๋„ค์ด๋ฒ„ VIBE ์ฐจํŠธ ์˜ค๋Š˜ Top 100 ๋…ธ๋ž˜ ๋ฒˆํ˜ธ๋“ค์„ ๋ชจ๋‘ ๊ฐ€์ ธ์™€ total ์ด๋ผ๋Š” ๊ฐ์ฒด์— ์ €์žฅํ•œ๋‹ค.

 

 

 

 

 

๋„ค์ด๋ฒ„ VIBE ์ฐจํŠธ ์˜ค๋Š˜ Top 100 ๋…ธ๋ž˜ ์ œ๋ชฉ, ๊ฐ€์ˆ˜, ๊ฐ€์‚ฌ  ํฌ๋กค๋งํ•˜์—ฌ ํด๋”์— ์ €์žฅํ•˜๊ธฐ

 

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์ด์ œ ์˜ค๋Š˜ Top 100 ์˜ ๋…ธ๋ž˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์™”์œผ๋‹ˆ, ํ•ด๋‹น ์ฐจํŠธ์˜ ๋…ธ๋ž˜ ์ œ๋ชฉ, ๊ฐ€์ˆ˜๋ช…, ๊ฐ€์‚ฌ๊นŒ์ง€ ํฌ๋กค๋งํ•˜์—ฌ ์›ํ•˜๋Š” ํด๋”์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

def get_lyrics(song_id):
	
    url = "https://vibe.naver.com/track/{}" # top 100 ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ ๋…ธ๋ž˜ ๋งํฌ
    drvier.get(url.format(song_id)) # driver ์—๊ฒŒ ๊ฐ ๋…ธ๋ž˜ ๋งํฌ ์ „๋‹ฌ
    time.sleep(2) # ํŽ˜์ด์ง€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์‹œ๊ฐ„ ๊ธฐ๋‹ค๋ ค์ฃผ๊ธฐ
    
    bs = BS(driver.page_source) # bs ์—๊ฒŒ ์›น ํŽ˜์ด์ง€ ์†Œ์Šค ์ „๋‹ฌ
    
    if not os.path.isdir("./lyrics") # ๊ฒฝ๋กœ์— lyrics ํด๋”๊ฐ€ ์—†๋‹ค๋ฉด
    	os.mkdir("./lyrics") # ๊ฒฝ๋กœ์— lyrics ํด๋” ๋งŒ๋“ค๊ธฐ
  	
    # ๋…ธ๋ž˜ ๊ฐ€์‚ฌ ์ €์žฅ
    lyrics = bs.find("div", {"class" : "end_section section_lyrics"}).find("p").text
    
    
    # ๋…ธ๋ž˜ ์ œ๋ชฉ ์ €์žฅ
    song_name = bs.find("span", class_ = "title").text.replace("๊ณก๋ช…", "")
    
    # ๊ฐ€์ˆ˜๋ช… ์ €์žฅ
    singer_name = bs.find("span", class_ = "sub_title").text.replace("์•„ํ‹ฐ์ŠคํŠธ๋ช…", "")
    
    # ํ•ด๋‹น ๊ฒฝ๋กœ์— '๋…ธ๋ž˜ ์ œ๋ชฉ - ๊ฐ€์ˆ˜๋ช….txt' ํ˜•์‹์œผ๋กœ ํŒŒ์ผ์— ๋…ธ๋ž˜ ๊ฐ€์‚ฌ ์ €์žฅ
    with open("./lyrics/" + f"{song_name}" + "-" + f"{singer_name}" + ".txt", "w", encoding='utf-8-sig') as f:
    	f.write(lyrics)

 

 

 

 

ํ•จ์ˆ˜ํ™”๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋ฉด, ์ด๋ ‡๊ฒŒ ์œ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

for idx, x in enumerate(total):
	if idx % 10 == 0:
    print(inx)
    get_lyrics(x)

 

ํŒŒ์ด์ฌ์˜ ๋‚ด์žฅ ํ•จ์ˆ˜์ธ enumerate() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, index ์™€ list ์˜ ์›์†Œ๋ฅผ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š”,

 

import tqdm

for x in tqdm.tqdm(total):
	get_lyrics(x)

 

tqdm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต๋ฌธ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

requests,  selenium, BeautifulSoup(bs4) ๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

 

 

- requests

 

HTTP ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ทธ ์š”์ฒญ์„ ํ†ตํ•ด ์›น ํŽ˜์ด์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1) ์›น ํŽ˜์ด์ง€์™€ ์ง์ ‘ ์ƒํ˜ธ ์ž‘์šฉํ•  ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ: ์ฆ‰, API ๋‚˜ ์›น ํŽ˜์ด์ง€ ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

 

 

- selenium

 

์›น ํŽ˜์ด์ง€๋ฅผ ์ž๋™ํ™”ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ด ๋‹จ์ˆœํ•œ requests ์‚ฌ์šฉ(HTTP ์š”์ฒญ)์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

1) ์›น ํŽ˜์ด์ง€๊ฐ€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์— ์˜์กดํ•  ๊ฒฝ์šฐ

2) ์ฝ˜ํ…์ธ ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

 

 

- BeautifulSoup

 

requests ๋˜๋Š” selenium ๊ณผ ๊ฐ™์€ ์›น ํŽ˜์ด์ง€๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ํŠน์ • ๋ฐ์ดํ„ฐ์˜ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

1) HTML ๋กœ ์ด๋ฃจ์–ด์ง„ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

2) requests ์™€ selenium ๊ณผ ๊ฐ™์ด ์›น ํŽ˜์ด์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

 

 


[ ์ •๋ฆฌ ] 

์›น ํŽ˜์ด์ง€์—์„œ ํŠน์ •ํ•œ ๋™์ž‘์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, requests ์™€ BeautifulSoup ๋งŒ ์žˆ์œผ๋ฉด ํฌ๋กค๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋ฒ„ํŠผ ํด๋ฆญ๊ณผ ๊ฐ™์€ ๋™์ž‘์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ถ”๊ฐ€๋กœ selenium ์„ ์ด์šฉํ•ด์•ผ ํฌ๋กค๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

'Python > [๊ธฐ์ดˆ ๊ฐ•์˜ ์ •๋ฆฌ]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

python ๊ธฐ์ดˆ 6  (0) 2023.02.26
python ๊ธฐ์ดˆ 5  (0) 2023.02.26
python ๊ธฐ์ดˆ 4  (1) 2023.02.25
Python ๊ธฐ์ดˆ 2  (0) 2023.02.15
Python ๊ธฐ์ดˆ 1  (0) 2023.02.13