๋ค์ด๋ฒ์ง๋๋ก ์ง๋ ์๋น์ค ๋ง๋ค๊ธฐ - 2ํ
์๋ ํ์ธ์:) ์ด๋ฒ ํฌ์คํ ์์๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ํ๋ผ์คํฌ์์ ๋์ํ๋ ๋ค์ด๋ฒ ์ง๋ ํฌ๋กค๋ง ์๋ฒ ํ๊ฒฝ์ ๊ตฌ์ถํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋ํ ์ง๋ ์๊ฐ(1ํ) ํฌ์คํ ์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ, ํฌ๋กค๋ง ์งํ์ ๊ณ ๋ คํด๋ณด๋ฉด ์ข์ ๋๋ชฉ๊ณผ ํฌ๋กค๋ฌ ์์ ์์ ๋ณธ ๋ค์ด๋ฒ ์ง๋์ ํน์ง์ ์๊ฐํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
1. ํฌ๋กค๋ง ์๋ฒํ๊ฒฝ ๊ตฌ์ถ
(์ด ํฌ์คํ
์๋ฆฌ์ฆ๋ mac os๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.)
๋จผ์ , ํ์ด์ฌ์ด ์ค์น๋์ด ์์ง ์์ผ๋ฉด ํ์ด์ฌ์ ์ค์นํด์ค๋๋ค. (์นจ๊ณ ๋งํฌ: https://programmers.co.kr/learn/courses/2/lessons/48) ํ์ด์ฌ ๋ฒ์ ํ์ธ(3.4์ด์ ํ์)
python --version
- ํ์ด์ฌ ๊ฐ์ํ๊ฒฝ ๊ตฌ์ถ ํด๋น ํ๋ก์ ํธ์์๋ง ๊ท์๋๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ธฐ ์ํด venv๊ฐ์ํ๊ฒฝ์ ๊ตฌ์ถํด ์ค๋๋ค.
pip install virtualenv //์ค์น
virtualenv ํด๋์ด๋ฆ //์์ฑ
source ํด๋์ด๋ฆ/bin/activate //์ ์
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ํฌ๋กค๋ง์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก์ ๋๋ค. ํ์ฌ๋ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ช๊ฐ์ง ์์ด ์ง์ pip install๋ช ๋ น์ด๋ฅผ ํตํด ์ค์น๋ฅผ ์งํํ์ง๋ง db์ฐ๊ฒฐ, ์ค์ผ์ค๋ฌ ์ค์ ๋ฑ์ด ์ถ๊ฐ๋๋ค๋ฉด ์ค์นํด์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์์ง๋๋ค. ์ด๋๋ requirements.txtํ์ผ์ ์ค์นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ช ์ํด๋๊ณ ํ ๋ฒ์ ์ค์นํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
pip install flask beautifulsoup4 selenium webdriver-manager
์ค๋ช
- flask: ํ์ด์ฌ ์น ํ๋ ์์ํฌ๋ก, ํฌ๋กค๋ง ์๋ฒ ๊ตฌ์ถ ํ
- beautifulsoup4: html parser๋ก, ์นํ์ด์ง ํฌ๋กค๋ง์, htmlํ๊ทธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ถ์ถํ๊ธฐ ์ํจ
- selenium: ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ผ๋ก ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋งํ๊ธฐ ์ํจ, ๋ง์ฐ์ค, ํค๋ณด๋ ๋ฑ ์ด๋ฒคํธ ํธ๋ค๋ง์ ์ฝ๊ฒ ์ํจ
- webdriver-manager: ํฌ๋กค๋ง์ ์๋ํ ์น ๋ธ๋ผ์ฐ์ ์ธ ํฌ๋กฌ์ ์ปจํธ๋กคํ๊ธฐ ์ํจ
ํ๋ผ์คํฌ ์๋ฒ ์คํ
app.py
import argparse
from flask import Flask
# ์คํ ํ๊ฒฝ๋ณ์ ์ค์
parser = argparse.ArgumentParser()
parser.add_argument('--env',required=False, default='development')
args = parser.parse_args()
# flask app ์์ฑ
app = Flask(__name__)
if __name__ == '__main__':
app.run(host='0.0.0.0', port='3060', debug=True, use_reloader=True)
In terminal
python app.py
2. ํฌ๋กค๋ง์ ์์๋๋ฉด ์ข์ 3๊ฐ์ง ์์
- ์์์น ๋ชปํ ์ํฉ์ ๋ํ ์ ์ฒ๋ฆฌ ์งํ
- sleep์ ํ์์ฑ
- Iframe๊ฐ ์ด๋
์์์น ๋ชปํ ์ํฉ์ ๋ํ ์ ์ฒ๋ฆฌ ์งํ
์นํ์ด์ง ํฌ๋กค๋ง์ ํ๋ค๋ณด๋ฉด ์๊ฐ์ง๋ ๋ชปํ ๋ถ๋ถ์์ ๋์์ด ๋ฉ์ถ๊ฑฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ๊ฐ์ ์ข ๋ฃ๋๋ ์ผ์ด ์ข ์ข ๋ฐ์ํฉ๋๋ค. ๋ง์ ์ด์ ๊ฐ ์์ง๋ง, ํฌ๊ฒ 3๊ฐ์ง ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
- ul > li ๋ด๋ถ์์ ์๋ก๋ค๋ฅธ ๊ฐ๋ณ์ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋ ๋
- ์น์ฌ์ดํธ ๋ด๋ถ html ํ๊ทธ์ ํ์์ด๋ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์์ ๋
- ๋คํธ์ํฌ ํต์ ์ด ๋ถ์์ ํ์ฌ ๋ก๋ฉ์๊ฐ์ด ๊ธธ์ด์ง๋๋ ๋์ผฐ์ ๋ ์ ์ํฉ์์ ์ผ๋จ ํฌ๋กค๋ง์ด ๊ณ์ ์งํ๋์ด ์์ฑํด๋ ๋ฐ๋ณต๋ฌธ์ ์ผ๋จ ๋๊น์ง ๋๋ฆฌ๊ฑฐ๋ ๋ค์ ํญ๋ชฉ์ผ๋ก ๋์ด๊ฐ๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ํฌ๋กค๋ง์ฝ๋๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ ค๋ณด๋ฉฐ ์ฌ๋ฌ๊ฐ์ง ์คํจ ์ผ์ด์ค๋ฅผ ์ฐพ์๋ด๊ณ , ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
sleep์ ํ์์ฑ
์ฝ๋๋ฅผ ์์ฑํ๊ณ ํฌ๋กค๋ง ์๋ฒ๋ฅผ ์คํ์์ผฐ์ ๋, ์ค์ ์ฝ๋ ์คํ ์๋์ ์น ์๋ฒ์ ๋ฐ์ดํฐ ์ ์ก ์๊ฐ ์ฐจ์ด๋ก ์ธํด ๋ฐํ์์ค๋ฅ๊ฐ ๋ฐ์ํ ๋๊ฐ ์กด์ฌํฉ๋๋ค. ์ด๋, ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์์ง์ ์ํ html ํ์ฑ์ด ์ด๋ฃจ์ด ์ง๊ธฐ ์ ์, ์ด๋ฏธ beautifulsoup์์ html์ parserํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ํ์ด์ฌ ๋ด๋ถํจ์์ธ time์ ๋ชจ๋ ์ค ์ฝ๋ ์คํ ์ง์ฐ ๋ชจ๋์ sleep()์ ํตํด ์ค์ ์ฝ๋ ์คํ์๋๋ฅผ ์น์๋ฒ์ ๋ง์ถ๋ ๊ฒ์ด ํด๊ฒฐ์ฑ ์ค ํ๋๊ฐ ๋ฉ๋๋ค. ์ด๋, time.sleep()ํจ์๋ก ์ง์ฐํ ์๊ฐ์ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉฐ ์ ์ ํ ์๊ฐ์์ ์กฐ๊ธ ๋๋ํ ์๊ฐ(+1~3์ด)์ ์ค์ ํด ๋๋ ๊ฒ์ ์ถ์ฒ ๋๋ฆฝ๋๋ค.
Iframe๊ฐ ์ด๋
Iframe์ HTML inline Frame ์์๋ก, ํ๋์ ์ฌ์ดํธ์ 2๊ฐ ์ด์์ ํ์ด์ง๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค.
๋ค์ด๋ฒ ์ง๋์์๋ ํ์ฌ ์ ์ฌ์ง์ฒ๋ผ ์ด 2๊ฐ์ Iframe์ด ์ฝ์ ๋์ด ์์ต๋๋ค.
- ๋นจ๊ฐ์ ํ ๋๋ฆฌ: ๊ฒ์ ๋ฐ ๊ฒฐ๊ณผ ์น์ Iframe
- ํ๋์ ํ ๋๋ฆฌ: ๊ฒ์ ์์ธ ์น์ Iframe ์ด๋ ๊ฒ ํ ์ฌ์ดํธ์ ์ฌ๋ฌ Iframe์ด ์กด์ฌํ์ฌ Iframe๊ฐ html ํ๊ทธ ์ ํ์ ๋๋๋ค๋, Iframe ์ ํ์ ํด์ค์ผ ํฉ๋๋ค. Iframe ์ ํ์ ์์์ ์๊ฐํ webdriver์ ๋ชจ๋ ์ค์ switch_to ๋ด๋ถํจ์๋ก ํ ์ ์์ต๋๋ค. Iframe ์ ํ์ ์ค์ ํฌ๋กค๋ง์ ์งํํด๋ณผ ๋ค์ ํฌ์คํ ์์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
3. ๋ค์ ํฌ์คํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๋ค์ ํฌ์คํ ์์๋ ๋ค์ด๋ฒ ์ง๋์์ ํค์๋๋ฅผ ํตํ ์ง์ญ ๊ฒ์์ ์งํํ ๋ค, ๊ฒ์๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํฌ๋กค๋ง์ผ๋ก ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ๋ณด๊ฒ ์ต๋๋ค.