๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL๐Ÿ”ฅ/๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ_AI School 5๊ธฐ

[๋ฉ‹์‚ฌ] AI SCHOOL 5๊ธฐ_ Day 15

by hk713 2022. 3. 28.

Web scraping Tips

 

1๏ธโƒฃ ์˜ค๋ฅ˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ์œ„ํ•ด ํฌ๋กค๋ง์„ ํ•˜๋‹ค๋ณด๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ์ค‘๋‹จ๋˜์–ด ๋ฒ„๋ ธ์„ ๋•Œ

์ด๋ฏธ ์Œ“์•„์™”๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ ๋ผ๊ฐ€๊ฑฐ๋‚˜ ํ˜น์€ ํŠน์ • ์‹œ์  ์ดํ›„๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ผฌ์—ฌ๋ฒ„๋ฆฌ๋Š” ์ผ์ด ์ƒ๊ธด๋‹ค.

๊ทธ๋Ÿด ๋•Œ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด try, except ๋ฌธ์ด๋‹ค.

try:
	# ์ผ๋‹จ ์‹คํ–‰ํ•ด ๋ณผ ์ฝ”๋“œ

except:
	# ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•  ์ฝ”๋“œ

 

2๏ธโƒฃ time.sleep()

ํฌ๋กค๋ง์„ ํ•˜๋ฉด์„œ ์‰ดํ‹ˆ์—†์ด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๊ธฐ๊ณ„์ธ๊ฑธ ๋ˆˆ์น˜์ฑ„์„œ ๋ง‰์•„๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

๊ทธ๋ž˜์„œ time.sleep์„ ์ด์šฉํ•ด ์ž ์‹œ ์ž‘๋™์„ ์‰ด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์•ผํ•œ๋‹ค. 

 

3๏ธโƒฃ pickle

ํŒŒ์ด์ฌ์€ ๊ฐ์ฒด๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” pickle ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•œ๋‹ค.

์ถœ์ฒ˜_ https://docs.python.org/ko/3/library/pickle.html

๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ํ”ผํด๋กœ ์ €์žฅํ•˜๊ณ , ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

https://docs.python.org/ko/3/library/pickle.html#module-pickle

 

pickle — ํŒŒ์ด์ฌ ๊ฐ์ฒด ์ง๋ ฌํ™” — Python 3.10.4 ๋ฌธ์„œ

pickle — ํŒŒ์ด์ฌ ๊ฐ์ฒด ์ง๋ ฌํ™” ์†Œ์Šค ์ฝ”๋“œ: Lib/pickle.py pickle ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ตฌ์กฐ์˜ ์ง๋ ฌํ™”์™€ ์—ญ ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ใ€Šํ”ผํด๋ง(pickling)ใ€‹์€ ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€

docs.python.org

 

4๏ธโƒฃ Selenium

์…€๋ ˆ๋‹ˆ์›€์€ ์›๋ž˜ ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ™”๋ฉด์„ ์ˆ˜์ •ํ•  ๋•Œ, ๋ฒˆ๊ฑฐ๋Ÿฌ์šด ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ์˜ ์ˆ˜๊ณ ๋ฅผ ๋œ๊ธฐ ์œ„ํ•ด ์ œ์ž‘๋œ ๊ฒƒ์ด๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ € ๊ฐ•์ œ ์กฐ์ข…์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํฐ ํŠน์ง•์„ ๊ฐ–๋Š”๋ฐ, ๋Š๋ฆฌ๊ณ  ํŠ•๊ธฐ๋Š” ์ผ์ด ๋งŽ๋‹ค๋Š” ํฐ ๋‹จ์ ๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›น ์Šคํฌ๋ž˜ํ•‘์„ ํ• ๋•Œ๋Š” ์›ฌ๋งŒํ•ด์„  ์…€๋ ˆ๋‹ˆ์›€์„ ์•ˆ์“ฐ๋Š” ์ชฝ์œผ๋กœ ํ•ด๋ณด๊ณ  ์ • ์•ˆ๋œ๋‹ค์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

์…€๋ ˆ๋‹ˆ์›€์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›น ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์˜ˆ์ „์—๋Š” ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐ›์•„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์•ผ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ๊ฒจ์„œ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค.

# ์ž๋™์œผ๋กœ ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„(๊ฐ€์ƒ๋ธŒ๋ผ์šฐ์ €) ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
from webdriver_manager.chrome import ChromeDriverManager 

# ๋‹ค์šด๋กœ๋“œ๋œ ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„ ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉ
from selenium.webdriver.chrome.service import Service 


# ์ž๋™์œผ๋กœ ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„(๊ฐ€์ƒ๋ธŒ๋ผ์šฐ์ €) ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ›„ ์„ธํŒ…
service = Service(executable_path=ChromeDriverManager().install()) 

# ์„ธํŒ…๋œ ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•ด ๊ฐ€์ƒ๋ธŒ๋ผ์šฐ์ € ์‹คํ–‰
driver = webdriver.Chrome(service=service)

์ด๋ ‡๊ฒŒ ๊ฐ€์ƒ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด์–ด ๋˜‘๊ฐ™์ด ํฌ๋กค๋ง์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

์ฃผ์˜ํ•  ์ ์€, ์ด ๊ฐ€์ƒ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฐฝ์„ ์ด๋™์‹œํ‚ฌ ๋•Œ๋งŒ ๋งŒ์ง€๊ณ , ์•ˆ๋งŒ์ง€๋Š”๊ฒŒ ๋ฒ ์ŠคํŠธ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ž๋™์œผ๋กœ ์ปจํŠธ๋กค ๋  ๋•Œ, ๊ฐ€์ƒ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ๊ฐ€์žฅ ์•ž์ชฝ์— ๋‘๋Š”๊ฒŒ ์ข‹๋‹ค. 


Word Cloud

 

Konlpy

KoNLPy(์ฝ”์—”์—˜ํŒŒ์ด)๋Š” ํ•œ๊ตญ์–ด ์ •๋ณด์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋‹ค.

https://konlpy.org/ko/latest/

 

KoNLPy: ํŒŒ์ด์ฌ ํ•œ๊ตญ์–ด NLP — KoNLPy 0.6.0 documentation

KoNLPy: ํŒŒ์ด์ฌ ํ•œ๊ตญ์–ด NLP KoNLPy(“์ฝ”์—”์—˜ํŒŒ์ด”๋ผ๊ณ  ์ฝ์Šต๋‹ˆ๋‹ค)๋Š” ํ•œ๊ตญ์–ด ์ •๋ณด์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ์„ค์น˜๋ฒ•์€ ์ด ๊ณณ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. NLP๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ์‹œ์ž‘ํ•˜๊ธฐ ์—์„œ ๊ฐ€

konlpy.org

from konlpy.tag import Okt

tokenizer = Okt() # ๊ฐ์ฒด ์ƒ์„ฑํ›„ ์‚ฌ์šฉ
tokens = tokenizer.pos("๋ฌธ์žฅ", norm=True, stem=True)
print(tokens) # ๊ฐ๊ฐ์˜ ํ† ํฐ๊ณผ ํ’ˆ์‚ฌ๋ฅผ ํŠœํ”Œ๋กœ ๋ฌถ์–ด ๋ณด์—ฌ์ค€๋‹ค
  • norm(normalization, ์ •๊ทœํ™”) 
  • stem(stemming, ์–ด๊ทผํ™”) 

 

WordCloud

์›Œ๋“œํด๋ผ์šฐ๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” WordCloud ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์ค˜์•ผํ•œ๋‹ค.

pip install wordcloud==1.5.0

๋‹ค์Œ์€ ์›Œ๋“œํด๋ผ์šฐ๋“œ๋ฅผ ์›ํ•˜๋Š” ๋ชจ์–‘์œผ๋กœ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋‹ค.

from wordcloud import WordCloud
from wordcloud import ImageColorGenerator

# ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๋ชจ์–‘์ด ๊ทธ๋ ค์ง„ ์‚ฌ์ง„์„ array๋กœ ๋ณ€ํ™˜
mask_image = np.array(Image.open("์›ํ•˜๋Š” ๋ชจ์–‘ ์‚ฌ์ง„"))

# ์›๋ณธ ์‚ฌ์ง„์˜ ์ƒ‰๊น”์„ ๊ฐ€์ ธ์˜ด
image_colors = ImageColorGenerator(mask_image)

# WordCloud ๊ฐ์ฒด ์ƒ์„ฑ
word_cloud = WordCloud(font_path="์‚ฌ์šฉํ• ํฐํŠธ๊ฒฝ๋กœ", 
                        max_words='์ตœ๋Œ€๋‹จ์–ด๊ฐฏ์ˆ˜',
                        max_font_size='์ตœ๋Œ€๊ธ€์žํฌ๊ธฐ',
                        width='๊ฐ€๋กœ๊ธธ์ด',
                        height='์„ธ๋กœ๊ธธ์ด',
                        mask=mask_image,
                        background_color="๋’ท๋ฐฐ๊ฒฝ์ƒ‰",
                        ).generate_from_frequencies('๋งŒ๋“ค์–ด ๋†“์€ ๋‹จ์–ด์‚ฌ์ „')

# ์›Œ๋“œํด๋ผ์šฐ๋“œ ํฌ๊ธฐ
plt.figure(figsize=(15,15))

# ์›๋ณธ ์‚ฌ์ง„์˜ ์ƒ‰๊น” ์ž…ํžˆ๊ธฐ
plt.imshow(word_cloud.recolor(color_func=image_colors), interpolation='bilinear')

# ์™„์„ฑ๋œ ์›Œ๋“œํด๋ผ์šฐ๋“œ ์ถœ๋ ฅ
plt.show()

'๋ฐ์ดํ„ฐ ๋ถ„์„' ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•œ 60๊ฐœ์˜ ๊ธฐ์‚ฌ์— ๋‚˜์˜จ,

์ตœ๋‹ค ์‚ฌ์šฉ ๋นˆ๋„ ๋‹จ์–ด ์ƒ์œ„ 100๊ฐœ๋ฅผ ํŒŒ์ด์ฌ ๋กœ๊ณ ์— ์”Œ์›Œ ๋งŒ๋“  ์›Œ๋“œํด๋ผ์šฐ๋“œ๋‹ค.

 

 

๋Œ“๊ธ€