| # ์ ๋น ๋ณด๋์๋ฃ ํฌ๋กค๋ฌ | |
| 6๊ฐ ์ ๋น ์น์ฌ์ดํธ์์ ๋ณด๋์๋ฃ, ๋ ผํ/๋ธ๋ฆฌํ, ๋ชจ๋๋ฐ์ธ์ ์๋์ผ๋ก ์์งํ๊ณ ํ๊น ํ์ด์ค์ ์ ๋ก๋ํ๋ ํฌ๋กค๋ฌ์ ๋๋ค. | |
| **์ง์ ์ ๋น**: ๋๋ถ์ด๋ฏผ์ฃผ๋น, ๊ตญ๋ฏผ์ํ, ์กฐ๊ตญํ์ ๋น, ๊ฐํ์ ๋น, ๊ธฐ๋ณธ์๋๋น, ์ง๋ณด๋น | |
| ## ์ฃผ์ ํน์ง | |
| - **๋น๋๊ธฐ ์ฒ๋ฆฌ (asyncio + aiohttp)**: ๊ธฐ์กด ๋๋น 10-20๋ฐฐ ๋น ๋ฅธ ์๋ | |
| - **6๊ฐ ์ ๋น ๋ณ๋ ฌ ํฌ๋กค๋ง**: ๋์์ ์คํํ์ฌ ์๊ฐ ๋จ์ถ | |
| - **์ฆ๋ถ ์ ๋ฐ์ดํธ**: ๋ง์ง๋ง ํฌ๋กค๋ง ์ดํ ๋ฐ์ดํฐ๋ง ์์ง | |
| - **ํ๊น ํ์ด์ค ์๋ ์ ๋ก๋**: ์ ๋น๋ณ ๋ ๋ฆฝ ์ ์ฅ์์ ์๋ ๋ณํฉ | |
| ## ์ค์น | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| ๋๋ Windows: | |
| ```bash | |
| setup.bat | |
| ``` | |
| ## ํ๊ฒฝ ๋ณ์ ์ค์ | |
| `.env` ํ์ผ ์์ฑ ํ ์๋ ๋ด์ฉ ์ ๋ ฅ: | |
| ``` | |
| HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx | |
| # ๊ฐ ์ ๋น๋ณ ํ๊น ํ์ด์ค ๋ฐ์ดํฐ์ ์ ์ฅ์ | |
| HF_REPO_ID=your_username/minjoo-press-releases | |
| HF_REPO_ID_PPP=your_username/ppp-press-releases | |
| HF_REPO_ID_REBUILDING=your_username/rebuilding-press-releases | |
| HF_REPO_ID_REFORM=your_username/reform-press-releases | |
| HF_REPO_ID_BASIC_INCOME=your_username/basic-income-press-releases | |
| HF_REPO_ID_JINBO=your_username/jinbo-press-releases | |
| ``` | |
| ## ์ฌ์ฉ ๋ฐฉ๋ฒ | |
| ### main.py - ํตํฉ ์ง์ ์ (์ถ์ฒ) | |
| ```bash | |
| # ์ ์ฒด ์ ๋น ์ฆ๋ถ ์ ๋ฐ์ดํธ (๊ธฐ๋ณธ) | |
| python main.py | |
| # ํน์ ์ ๋น๋ง | |
| python main.py --party minjoo # ๋๋ถ์ด๋ฏผ์ฃผ๋น | |
| python main.py --party ppp # ๊ตญ๋ฏผ์ํ | |
| python main.py --party rebuilding # ์กฐ๊ตญํ์ ๋น | |
| python main.py --party reform # ๊ฐํ์ ๋น | |
| python main.py --party basic_income # ๊ธฐ๋ณธ์๋๋น | |
| python main.py --party jinbo # ์ง๋ณด๋น | |
| # ๋ ์ง ๋ฒ์ ์ง์ | |
| python main.py --start-date 2024-01-01 | |
| python main.py --party reform --start-date 2024-01-01 --end-date 2024-06-30 | |
| # ๋์๋ง | |
| python main.py --help | |
| ``` | |
| ### ๊ฐ๋ณ ํฌ๋กค๋ฌ ์ง์ ์คํ | |
| ```bash | |
| python minjoo_crawler_async.py | |
| python ppp_crawler_async.py | |
| python rebuilding_crawler_async.py | |
| python reform_crawler_async.py | |
| python basic_income_crawler_async.py | |
| python jinbo_crawler_async.py | |
| ``` | |
| ### ๋งค์ผ ์๋ ์คํ (์ค์ผ์ค๋ฌ) | |
| ```bash | |
| python unified_scheduler.py # ๋งค์ผ ์ค์ 9์ ์ ์ฒด ์๋ ์คํ | |
| ``` | |
| ### Windows ๋ฐฐ์น ํ์ผ | |
| | ํ์ผ | ์ค๋ช | | |
| |------|------| | |
| | `run_unified.bat` | ์ ์ฒด ๋์ ํฌ๋กค๋ง (ํ ๋ฒ) | | |
| | `run_unified_scheduler.bat` | ์ ์ฒด ๋งค์ผ ์๋ ํฌ๋กค๋ง | | |
| | `run_once.bat` | ๋ฏผ์ฃผ๋น๋ง | | |
| | `run_ppp.bat` | ๊ตญ๋ฏผ์ํ๋ง | | |
| ## ์์ง ๋ฐ์ดํฐ | |
| | ์ ๋น | ๊ฒ์ํ | ์์ง ์์์ผ | | |
| |------|--------|------------| | |
| | ๋๋ถ์ด๋ฏผ์ฃผ๋น | ๋ณด๋์๋ฃ, ๋ ผํ/๋ธ๋ฆฌํ, ๋ชจ๋๋ฐ์ธ | 2003-11-11 | | |
| | ๊ตญ๋ฏผ์ํ | ๋๋ณ์ธ ๋ ผํ๋ณด๋์๋ฃ, ์๋ด ๋ณด๋์๋ฃ, ๋ฏธ๋์ดํน์ | 2000-03-10 | | |
| | ์กฐ๊ตญํ์ ๋น | ๊ธฐ์ํ๊ฒฌ๋ฌธ, ๋ ผํ๋ธ๋ฆฌํ, ๋ณด๋์๋ฃ | 2024-03-04 | | |
| | ๊ฐํ์ ๋น | ๋ณด๋์๋ฃ, ๋ ผํ๋ธ๋ฆฌํ | 2024-02-13 | | |
| | ๊ธฐ๋ณธ์๋๋น | ๋ ผํยท๋ณด๋์๋ฃ (๋ ผํ/๋ฐ์ธ/๋ณด๋์๋ฃ) | 2020-01-08 | | |
| | ์ง๋ณด๋น | ๋ณด๋์๋ฃ, ๋ ผํ, ๋ชจ๋๋ฐ์ธ | 2017-10-14 | | |
| ## ์ค์ (crawler_config.json) | |
| ๊ฐ ์ ๋น๋ณ๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์ค์ ๊ฐ๋ฅ: | |
| ```json | |
| { | |
| "minjoo": { ... }, | |
| "ppp": { ... }, | |
| "rebuilding": { ... }, | |
| "reform": { ... }, | |
| "basic_income": { ... }, | |
| "jinbo": { ... } | |
| } | |
| ``` | |
| | ์ค์ | ์ค๋ช | | |
| |------|------| | |
| | `boards` | ์์งํ ๊ฒ์ํ ๋ชฉ๋ก | | |
| | `start_date` | ์ต์ด ํฌ๋กค๋ง ์์ ๋ ์ง | | |
| | `max_pages` | ์ต๋ ํ์ด์ง ์ | | |
| | `concurrent_requests` | ๋์ ์์ฒญ ์ (์๋ฒ ๋ถ๋ด ๊ณ ๋ ค) | | |
| | `request_delay` | ์์ฒญ ๊ฐ ๋๊ธฐ ์๊ฐ(์ด) | | |
| | `output_path` | ๋ก์ปฌ ์ ์ฅ ๊ฒฝ๋ก | | |
| ## ํ์ผ ๊ตฌ์กฐ | |
| ``` | |
| ์ ๋นํฌ๋กค๋ฌ/ | |
| โโโ main.py # ํตํฉ ์ง์ ์ (CLI ์ธ์ ์ง์) | |
| โโโ unified_crawler.py # 6๊ฐ ์ ๋น ํตํฉ ํฌ๋กค๋ฌ | |
| โโโ unified_scheduler.py # ํตํฉ ์ค์ผ์ค๋ฌ | |
| โโโ minjoo_crawler_async.py # ๋๋ถ์ด๋ฏผ์ฃผ๋น | |
| โโโ ppp_crawler_async.py # ๊ตญ๋ฏผ์ํ | |
| โโโ rebuilding_crawler_async.py # ์กฐ๊ตญํ์ ๋น | |
| โโโ reform_crawler_async.py # ๊ฐํ์ ๋น | |
| โโโ basic_income_crawler_async.py # ๊ธฐ๋ณธ์๋๋น | |
| โโโ jinbo_crawler_async.py # ์ง๋ณด๋น | |
| โโโ scheduler.py # ๋ฏผ์ฃผ๋น ์ ์ฉ ์ค์ผ์ค๋ฌ (๋ ๊ฑฐ์) | |
| โโโ crawler_config.json # ํฌ๋กค๋ง ์ค์ (6๊ฐ ์ ๋น) | |
| โโโ crawler_state.json # ํฌ๋กค๋ง ์ํ (์๋ ์์ฑ) | |
| โโโ requirements.txt # Python ์์กด์ฑ | |
| โโโ .env # ํ๊ฒฝ ๋ณ์ (์ง์ ์์ฑ) | |
| ``` | |
| ## ๋ฐ์ดํฐ ์ปฌ๋ผ (๊ณตํต) | |
| | ์ปฌ๋ผ | ์ค๋ช | | |
| |------|------| | |
| | `board_name` | ๊ฒ์ํ ์ด๋ฆ | | |
| | `title` | ์ ๋ชฉ | | |
| | `category` | ์นดํ ๊ณ ๋ฆฌ/๋ถ๋ฅ | | |
| | `date` | ๊ฒ์ ๋ ์ง | | |
| | `writer` | ์์ฑ์ | | |
| | `text` | ๋ณธ๋ฌธ | | |
| | `url` | ์๋ฌธ URL | | |
| > **์ฐธ๊ณ **: ๊ตญ๋ฏผ์ํ์ `category` ๋์ `section`, `no` ์ปฌ๋ผ ์ถ๊ฐ ํฌํจ | |
| ## ์ฑ๋ฅ | |
| | ํญ๋ชฉ | ๋น๋๊ธฐ ๋ฒ์ | ๊ธฐ์กด ๋๊ธฐ ๋ฒ์ | | |
| |------|------------|--------------| | |
| | ์ ๋น 1๊ฐ (1000๊ฐ) | ~5๋ถ | ~80๋ถ | | |
| | 6๊ฐ ์ ๋น ๋์ | ~5-10๋ถ | ~480๋ถ | | |
| ## ์ฆ๋ถ ์ ๋ฐ์ดํธ ์๋ ๋ฐฉ์ | |
| 1. **์ฒซ ์คํ**: `start_date`๋ถํฐ ์ค๋๊น์ง ์ ์ฒด ์์ง | |
| 2. **์ดํ ์คํ**: ๋ง์ง๋ง ํฌ๋กค๋ง ๋ ์ง ๋ค์๋ ๋ถํฐ๋ง ์์ง | |
| 3. **ํ๊น ํ์ด์ค ๋ณํฉ**: ๊ธฐ์กด ๋ฐ์ดํฐ์ ๊ณผ ์๋ ๋ณํฉ + URL ๊ธฐ์ค ์ค๋ณต ์ ๊ฑฐ | |
| 4. **์ํ ๊ด๋ฆฌ**: ์ ๋น๋ณ๋ก ๋ ๋ฆฝ์ ์ผ๋ก `crawler_state.json`์ ๊ธฐ๋ก | |
| ## ๋ฌธ์ ํด๊ฒฐ | |
| | ๋ฌธ์ | ํด๊ฒฐ ๋ฐฉ๋ฒ | | |
| |------|----------| | |
| | `HF_TOKEN์ด ์ค์ ๋์ง ์์์ต๋๋ค` | `.env` ํ์ผ์ `HF_TOKEN` ํ์ธ | | |
| | ํฌ๋กค๋ง์ด ๋๋ฆผ | `crawler_config.json`์์ `concurrent_requests` ์ฆ๊ฐ | | |
| | ์๋ฒ ์ฐ๊ฒฐ ์ค๋ฅ | `crawler_config.json`์์ `request_delay` ์ฆ๊ฐ | | |
| | ํน์ ์ ๋น๋ง ์คํจ | `python main.py --party [์ ๋น์ฝ๋]` ๋ก ๊ฐ๋ณ ์คํํ์ฌ ํ์ธ | | |
| ## ๋ก๊ทธ ํ์ธ | |
| ```bash | |
| type main.log # main.py ์คํ ๋ก๊ทธ | |
| type unified_crawler.log # ํตํฉ ํฌ๋กค๋ฌ ๋ก๊ทธ | |
| type unified_scheduler.log # ์ค์ผ์ค๋ฌ ๋ก๊ทธ | |
| ``` | |
| ## Windows ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ | |
| ```bash | |
| # ๋ฐฐ์น ํ์ผ | |
| start /B python main.py > main.log 2>&1 | |
| # ๋๋ Windows ์์ ์ค์ผ์ค๋ฌ | |
| # ํธ๋ฆฌ๊ฑฐ: ๋งค์ผ ์ค์ 9์ โ ๋์: python unified_scheduler.py | |
| ``` | |
| ## ์ฃผ์์ฌํญ | |
| 1. `concurrent_requests`๋ 10-20 ์ดํ ๊ถ์ฅ (์๋ฒ ๋ถ๋ด ์ต์ํ) | |
| 2. ์์ง ์ ์น์ฌ์ดํธ robots.txt ํ์ธ | |
| 3. ๊ณต๊ฐ ์ ๊ฐ์ธ์ ๋ณด ํฌํจ ์ฌ๋ถ ํ์ธ ๋ฐ ์ถ์ฒ ๋ช ์ | |
| ## ๋ผ์ด์ ์ค | |
| MIT License | |