
1. ์น ๊ตฌ์กฐ
์น ํ๊ฒฝ์ ํต์ฌ์ ์๋ฒ–ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ(request)์ ๋ณด๋ด๊ณ ์๋ฒ๊ฐ ์๋ต(response)์ ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์ํ ๋ ์ฌ์ฉํ๋ ์ฃผ์๊ฐ ๋ฐ๋ก URL์ด๋ฉฐ, ์ด๋ ๋ด๋ถ์ ์ผ๋ก IP ์ฃผ์์ ํฌํธ ๋ฒํธ๋ก ๋ณํ๋๋ค. IP ์ฃผ์๋ ๋ฌผ๋ฆฌ์ ์ธ ์๋ฒ์ ์์น๋ฅผ ์๋ฏธํ๊ณ , ํฌํธ ๋ฒํธ๋ ๊ทธ ์๋ฒ ์์์ ์ด๋ค ์๋น์ค(์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ๋ฑ)์ ์ ๊ทผํ ์ง๋ฅผ ๊ตฌ๋ถํ๋ ์ญํ ์ ํ๋ค.
์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ํํ๊ธฐ ์ํด์๋ ๊ณตํต๋ ์ฝ์์ธ HTTP ํ๋กํ ์ฝ์ด ํ์ํ๋ค. ์น์์ ์ด๋ฃจ์ด์ง๋ ๋ชจ๋ ํต์ ์ ์ด HTTP ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์ด ์์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ด ๋ฐ๋ก Request์ Response๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ๋ ๊ทธ ์์ฒญ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌํ๋ค. ์น์ ๊ฒฐ๊ตญ ์ด ์์ฒญ๊ณผ ์๋ต์ ๋ฐ๋ณต์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ๋ณผ ์ ์๋ค.
ํ๋ก ํธ์ค๋
ํ๋ก ํธ์๋๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ณด๊ณ ์ํธ์์ฉํ๋ ์์ญ
- HTML์ ํ์ด์ง์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ์ ์ํ๊ณ , CSS๋ ๊ทธ ๋ด์ฉ์ ์ด๋ป๊ฒ ๊พธ๋ฐ์ง๋ฅผ ๊ฒฐ์ ํ๋ค. JavaScript๋ ๋ฒํผ ํด๋ฆญ, ํ์ ํ์, ํ๋ฉด ๋ณํ ๊ฐ์ ๋์ ์ธ ๋์์ ๋ด๋นํ๋ค. ์๋ฒ์์ HTML๊ณผ CSS, JavaScript ํ์ผ์ ํจ๊ป ์ ๋ฌํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์กฐํฉํด ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ์น ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
- ๋ฐฑ์๋๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ ์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํ ๋ฐ ๊ฐ๊ณตํด ๋ค์ ํ๋ก ํธ์๋๋ก ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ด๋ค ๊ฒ์๊ธ์ ๋ณด๊ณ ์ถ๋ค๊ณ ์์ฒญํ๋ฉด, ๋ฐฑ์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํด๋น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ HTML ํํ๋ก ๋ง๋ค์ด ์๋ตํ๋ค. ์ด ๊ณผ์ ์์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ HTTP๋ฅผ ํตํด ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ์์ ๊ฒ์ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด HTML ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋ด์ค ์ ๋ชฉ, ๋งํฌ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํ๊ทธ์ ๊ฒฝ๋ก๋ก ๊ตฌ์ฑ๋์ด ์๋์ง๋ฅผ ํ์ ํ ์ ์๋ค. ํฌ๋กค๋ง์ ์ด HTML ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ์ง ์ฌ์ ์ ๋ช ํํ ์ ์ํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
๋ฐฑ์ค๋
์น ์๋น์ค์ ๋ฐฑ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์น ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ก ๊ตฌ์ฑ๋๋ค. ์๋ฒ์ ์ญํ ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ค.
์ฒซ์งธ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด๊ณ , ๋์งธ๋ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ์ฌ์ฉ์์ ์์ฒญ์ ๋ง๊ฒ ๊ฐ๊ณตํด ์น ํ์ด์ง ํํ๋ก ์ ๋ฌํ๋ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฌ์ฉ์ ์ ๋ณด, ๊ฒ์๊ธ, ๋ก๊ทธ ๊ฐ์ ๋ฐฉ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ฉฐ, ์น ์๋ฒ๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ HTML, CSS, ์ด๋ฏธ์ง ๋ฑ์ ํํ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ค.
- ์น ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋จ์์ ์์ฒญ์ ๋ฐ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋์ ์์ฒญ์ ๋ค๋ก ๋๊ธฐ๋ ์ญํ
- ์ด๊ธฐ์ ์น ์๋ฒ๋ ๋งค์ฐ ๋จ์ํ๋ค. Apache HTTP Server๋ Nginx ๊ฐ์ ์น ์๋ฒ๋ ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ HTTP ์์ฒญ์ ๋ฐ์ผ๋ฉด, ์๋ฒ์ ์กด์ฌํ๋ HTML·CSS·์ด๋ฏธ์ง ๊ฐ์ ์ ์ ํ์ผ์ ๊ทธ๋๋ก ์ฝ์ด ์๋ต์ผ๋ก ๋ด๋ ค์ฃผ๋ ์ญํ ๋ง ์ํํ๋ค. ์ด ๋จ๊ณ์ ์น ์๋ฒ๋ “์์ฒญ์ ๋ฐ์ ํ์ผ์ ์ ๋ฌํ๋ ๊ฒ”์ ์ต์ ํ๋ ์กด์ฌ์๊ณ , ๋น ๋ฅธ ์๋ต๊ณผ ์์ ์ ์ธ ์ฐ๊ฒฐ ์ฒ๋ฆฌ์ ๊ฐ์ ์ด ์์๋ค.
- WAS๋ ๊ทธ ์์ฒญ์ ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ ์คํํ๋ ์คํ ์์ง
- ํ์ง๋ง ์ฌ์ฉ์์ ์์ฒญ์ด ๋จ์ํ “ํ์ด์ง ์์ฒญ”์ ๋์ด ๋ฐ์ดํฐ ์กฐํ, ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ, ์ฌ์ฉ์๋ณ ๋ง์ถค ์๋ต์ผ๋ก ํ์ฅ๋๋ฉด์ ์ ์ ํ์ผ๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์๊ฒผ๋ค. ์ด๋ ๋ฑ์ฅํ ๊ฒ์ด WAS.
- Tomcat ๊ฐ์ WAS๋ ์น ์๋ฒ๊ฐ ์ ๋ฌํ ์์ฒญ์ ๋ฐ์ ๋ด๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์คํํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํด ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค ๋ค์ ์น ์๋ฒ ๋๋ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋๋ ค์ค๋ค. WAS๋ ๋จ์ ์ ๋ฌ์ด ์๋๋ผ ๋น์ฆ๋์ค ๋ก์ง ์คํ, ํธ๋์ญ์ ๊ด๋ฆฌ, ์ธ์ ๊ด๋ฆฌ ๊ฐ์ “์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ๊ฒฝ”์ ์ ๊ณตํ๋ค๋ ์ ์์ ์น ์๋ฒ์ ๋ณธ์ง์ ์ผ๋ก ๋ค๋ฅด๋ค.
- WAS ์์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํจ์จ์ ์ด๊ณ ์ผ๊ด๋๊ฒ ๊ฐ๋ฐํ๋๋ก ๋์์ฃผ๋ ๊ฐ๋ฐ ๋๊ตฌ
- ์น ํ๋ ์์ํฌ๋ WAS ์์์ ๋์ํ๋ฉด์ ๊ฐ๋ฐ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ๊ตฌ์กฐ์ ๊ท์น์ ์ ๊ณตํ๋ ๋๊ตฌ๋ค.
- URL ๋ผ์ฐํ , ์์ฒญ/์๋ต ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๊ฒ์ฆ, ์์ธ ์ฒ๋ฆฌ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์์ ์ ๋ฏธ๋ฆฌ ์ ํํํด ์ค๋ค. ๋๋ถ์ ๊ฐ๋ฐ์๋ HTTP ์ฒ๋ฆฌ๋ ์๋ฒ ๋ด๋ถ ๋์์ ์ผ์ผ์ด ์ ๊ฒฝ ์ฐ์ง ์๊ณ , ๋น์ฆ๋์ค ๋ก์ง ์์ฒด์ ์ง์คํ ์ ์๋ค.
- ์ค์ํ ์ ์ ์น ํ๋ ์์ํฌ๊ฐ “์๋ฒ ๊ทธ ์์ฒด”๋ ์๋๋ผ๋ ๊ฒ์ด๋ค. ์ค์ ๋ก ๋คํธ์ํฌ ํฌํธ๋ฅผ ์ด๊ณ ์์ฒญ์ ๋ฐ์๋ค์ด๋ ์ญํ ์ ์ฌ์ ํ WAS(์: Tomcat, Uvicorn)๊ฐ ๋ด๋นํ๊ณ , ์น ํ๋ ์์ํฌ๋ ๊ทธ ์์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ค.
- ์น ํ๋ ์์ํฌ๋ ์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋, ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋๋ก ๋ฌถ์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ๋์ฌ์ค๋ค.
- ์น ํ๋ ์์ํฌ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ณ , WAS๋ ํด๋น ํ๋ ์์ํฌ๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๋ก ์คํํ๊ณ ๊ด๋ฆฌํ๋ ์๋ฒ ํ๊ฒฝ์ด๋ค.
[WAS]
โ ์น ์์ฒญ ์ฒ๋ฆฌ
โ ์คํฌ๋ฆฝํธ ์คํ
โ DB ์ฐ๊ฒฐ
โ ํธ๋์ญ์
โ ๋ณด์
[ Client ]
↓
[ Web Server (Nginx) ]
↓
[ WAS ]
↓
[ Web Framework ]
↓
[ Application Code ]
↓
[ Database ]
ํฌ๋กค๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ/ํ๋ ์์ํฌ ๋น๊ต
| ๊ตฌ๋ถ | BeautifulSoup | Scrapy | Selenium |
| ์ฑ๊ฒฉ | HTML ํ์(Parser) | ์น ํฌ๋กค๋ง ํ๋ ์์ํฌ | ๋ธ๋ผ์ฐ์ ์๋ํ ๋๊ตฌ |
| ์ฃผ ์ฉ๋ | ์ ์ HTML ํ์ฑ | ๋๊ท๋ชจ·๊ณ ์ ํฌ๋กค๋ง | JS ๋ ๋๋ง ํ์ด์ง |
| JS ์ฒ๋ฆฌ | ๋ถ๊ฐ | ๋ถ๊ฐ | ๊ฐ๋ฅ |
| ๋น๋๊ธฐ ์ฒ๋ฆฌ | ๋ถ๊ฐ | ๊ฐ๋ฅ | ๋ถ๊ฐ |
| ์๋ | ๋๋ฆผ | ๋งค์ฐ ๋น ๋ฆ | ๊ฐ์ฅ ๋๋ฆผ |
| ๋ณ๋ ฌ ํฌ๋กค๋ง | ๋ถ๊ฐ | ๊ฐ๋ฅ | ๋ถ๊ฐ |
| ํ์ด์ง๋ค์ด์ | ์๋ ๊ตฌํ | ์๋ ๊ตฌ์กฐํ ์ฉ์ด | ์๋ |
| ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ | ๋ถ๊ฐ | Item / Pipeline | ๋ถ๊ฐ |
| robots.txt | ๋ถ๊ฐ | ๊ธฐ๋ณธ ์ง์ | ๋ถ๊ฐ |
| ๋ํ ์ฌ์ฉ ์ | ๊ฐ๋จํ HTML ๋ถ์ | ์ผํ๋ชฐ·๋ด์ค·์นดํ ๊ณ ๋ฆฌ ์์ง | SPA, ๋ฌดํ ์คํฌ๋กค |
Scrapy๋ ๋๊ท๋ชจ ํฌ๋กค๋ง, ์ค์ผ์ค๋ง, ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ ๋ฑ์์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ์ค๋ฌด์ ์ธ ํฌ๋กค๋ง ์์ ์์๋ BeuatifulSoup๋ณด๋ค ๋ ์ ํฉํ๋ค.
- Spider(ํฌ๋กค๋ง ๋ก์ง)
- Item(์์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์)
- Pipeline(์์ง ํ ๋ฐ์ดํฐ ์ ์ ·ํํฐ๋ง·DB ์ ์ฅ)
- Logging, ํต๊ณ, ์๋ฌ ์ฒ๋ฆฌ
์ถ์ถํ ๋ฐ์ดํฐ๋ ๋จ์ ์ถ๋ ฅ๋ฟ ์๋๋ผ, Item ๊ฐ์ฒด์ ๋ด์ yieldํจ์ผ๋ก์จ Scrapy ํ์ดํ๋ผ์ธ์ผ๋ก ์ ๋ฌ๋๋ค. ์ด ๊ตฌ์กฐ ๋๋ถ์ ๋ฐ์ดํฐ๊ฐ ํ๋์ฉ ์คํธ๋ฆผ ํํ๋ก ์์ด๋ฉฐ, ์ดํ JSON ํ์ผ ์ ์ฅ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฌ ๊ฐ์ ํ์ฒ๋ฆฌ๋ฅผ ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์๋ค.
| HTML ํ์ผ ๋ถ์ | BeautifulSoup |
| ์ ์ ์น ๋๋ ์์ง | Scrapy |
| JS ํ์, ๋ฌดํ์คํฌ๋กค | Selenium |
| ๋ก๊ทธ์ธ ํ ๋ฐ์ดํฐ | Selenium → Scrapy |
| ์๋·์์ ์ฑ ์ค์ | Scrapy |
| ๋จ๋ฐ์ฑ ํฌ๋กค๋ง | BeautifulSoup |
์น ๋ฐ์ดํฐ ์ ์๊ถ, ํฌ๋กค๋ง ์ ์ฑ
์น ๋ฐ์ดํฐ ํ์ฉ์์ ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ คํด์ผ ํ ๊ฒ์ ์ ์๊ถ ๋ฌธ์ ๋ค.
๋จ์ํ ์ฌ์ดํธ ๋ฉ์ธ ์ฃผ์๋ ํน์ ๊ฒ์๋ฌผ URL๋ก ์ด๋์ํค๋ ๋จ์ ๋งํฌ·์ง์ ๋งํฌ๋ ๋ณดํต ์ ์๊ถ ์นจํด๋ก ๋ณด์ง ์์ง๋ง, ๊ฒ์๋ฌผ ๋ด์ฉ์ ๊ทธ๋๋ก ๋ ธ์ถํ๊ฑฐ๋ iframe์ผ๋ก ์๋ณธ์ ํต์งธ๋ก ๋ณด์ฌ์ฃผ๋ ํ๋ ์ ๋งํฌ·์๋ฒ ๋ ๋งํฌ๋ ์นจํด ์์ง๊ฐ ํฌ๋ค.
์ฆ, ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ฒ์ํ๋ ํ์๋ ๋งค์ฐ ์ ์คํด์ผ ํ๋ฉฐ, “์๋ฌธ์ผ๋ก ์ด๋ํ๋ ๋งํฌ ์ ๊ณต”์ด ์๋์ ์ผ๋ก ์์ ํ๋ค.
ํฌ๋กค๋ง ์ ์๋ ๋ฐ๋์ robots.txt๋ฅผ ํ์ธํด์ผ ํ๋ค. robots.txt๋ ํฌ๋กค๋ฌ๋ณ ์ ๊ทผ ํ์ฉ ๋ฒ์๋ฅผ ๋ช ์ํ ์ด์์์ ๊ณต์ ์ ์ฑ ์ผ๋ก, ๋ฒ์ ๊ฐ์ ๋ ฅ์ ์์ง๋ง ์ด๋ฅผ ๋ฌด์ํ๋ฉด ์ค๋ฆฌ์ ·๋ฒ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์ฌ์ดํธ๋ง๋ค ํน์ ๊ฒ์ํ๋ง ์ ํํ๊ฑฐ๋, ๋๋ ์ด๋ฅผ ์๊ตฌํ๊ฑฐ๋, ์์ ์ ๋ฉด ์ฐจ๋จํ๋ ๋ฑ ์ ์ฑ ์ด ๋ค๋ฅด๋ค.
Scrapy
scrapy startproject ๋ช ๋ น์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋ค.
์ฌ๊ธฐ์๋ settings.py, spiders/, items.py, pipelines.py, ๊ทธ๋ฆฌ๊ณ scrapy.cfg ๊ฐ์ ํ์ผ๋ค์ด ํฌํจ๋๋ค.
ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ฉด ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๊ณ , ํฌ๋กค๋งํ ๋ด์ฉ์ ์ ํ ๋ค์, ์ด๋ฌํ ํ๋๋ค์ items.py์์ Item ํด๋์ค๋ก ๋ฏธ๋ฆฌ ์ ์ํ๋ค. ์ํ๊ณ spiders/์์ ์งํํด๋ ๋์ง๋ง, ์ด๋, ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํด ๋๋ฉด ์ดํ ์ฒ๋ฆฌ์ ์ ์ฅ์ด ์์ํด์ง๋ค.
items.py
- items.py๋ ํฌ๋กค๋ง ๊ฒฐ๊ณผ๋ก ์์งํ๊ณ ์ถ์ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ํ์ผ
- ex) ๊ฒ์๊ธ์ ์ ๋ชฉ, ์์ฑ์, URL ๊ฐ์ ํ๋๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํด ๋๋ ์ญํ
- ์ดํ Spider๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋ Item ํํ๋ก ์ ๋ฆฌ๋์ด Pipeline์ผ๋ก ์ ๋ฌ๋๋ค.
- ์ด๋ ๊ฒ ์์ฑ๋ Item๋ค์ yield๋ฅผ ํตํด ์ฐจ๊ณก์ฐจ๊ณก ์์ด๋ฉฐ, ํฌ๋กค๋ง ์คํ ์ ์ฝ์ ์ถ๋ ฅ์ด๋ ํ์ผ ์ ์ฅ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
spiders/
์ด๋ค ์ฌ์ดํธ๋ฅผ ์ด๋ป๊ฒ ํฌ๋กค๋งํ ์ง์ ๋ํ ์ฝ๋๊ฐ ์ด๊ณณ์ ์์ฑ๋๋ค.
Spider์์ ํฌ๋กค๋ง์ ์์ ์ง์ ์ ์ง์ ํ๋๋ฐ, ์ด๋ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
- start_urls ๋ฆฌ์คํธ์ URL ๋ฌธ์์ด๋ค์ ์ง์ ๋์ดํ๋ ๋ฐฉ์
- start_requests ๋ฉ์๋๋ฅผ ์ ์ํด URL๊ณผ ์ฝ๋ฐฑ ํจ์๋ฅผ ํจ๊ป ์ง์ ํ๋ ๋ฐฉ์
- ์ฌ๋ฌ ์์ URL์ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์๊ณ , ์ฌ์ดํธ๋ณ๋ก ๋ค๋ฅธ ํ์๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
- ํ์ด์ง๋ค์ด์ ์ฒ๋ฆฌ์์ URL ๊ตฌ์กฐ๋ฅผ ๋ถ์ํด ํ์ด์ง ๋ฒํธ๋ง ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ์ํํ๋๋ก Request๋ฅผ ๋ฐ๋ณต ์์ฑํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด “1ํ์ด์ง๋ถํฐ Nํ์ด์ง๊น์ง” ์ํ๋ ๋ฒ์๋งํผ ์์ ์ ์ผ๋ก ํฌ๋กค๋งํ ์ ์๋ค.
ํฌ๋กค๋ง์ด ์์๋๋ฉด, ๊ฐ ์์ฒญ์ ๋ํด ์ฝ๋ฐฑ ํจ์(๋ณดํต parse)๊ฐ ํธ์ถ๋๋ค. ์ด ์ฝ๋ฐฑ ํจ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ response ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ, ์ด ์์๋ HTML ๋ฌธ์ ์ ์ฒด๊ฐ ๋ค์ด ์๋ค. ๊ฐ๋ฐ์๋ ์ด response๋ฅผ ๋ถ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ฒ ๋๋ค.
์ด๋ ์ฌ์ฉํ๋ ๋๊ตฌ๊ฐ Selector์ด๋ฉฐ, Scrapy๋ ๋ ๊ฐ์ง ์ ํ ๋ฐฉ์์ ์ ๊ณตํ๋ค. ํ๋๋ XPath, ๋ค๋ฅธ ํ๋๋ CSS Selector๋ค.
- XPath: HTML ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌ ํํ๋ก ๋ฐ๋ผ๊ฐ๋ฉฐ ๋ ธ๋๋ฅผ ์ ํํ๋ ๋ฐฉ์
- CSS Selector: ์น ํ๋ก ํธ์๋์์ ์ฌ์ฉํ๋ ์ ํ์ ๋ฌธ๋ฒ๊ณผ ์ ์ฌํด ์ง๊ด์
ํ๊ทธ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ๋๋ฉฐ, .extract() ๋๋ .getall() ๊ฐ์ ๋ฉ์๋๋ฅผ ํตํด ์ค์ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ป๋๋ค. ์ด๋ฏธ์ง ํ๊ทธ, ๋งํฌ ํ๊ทธ์ฒ๋ผ ์ค์ฒฉ๋ ๊ตฌ์กฐ์์๋ XPath๋ CSS Selector ์กฐ๊ฑด์ ์ ์กฐํฉํ๋ฉด ์ํ๋ ๋ฐ์ดํฐ๋ง ์ ํํ ๋ฝ์๋ผ ์ ์๋ค.
์ด๋ ๊ฒ Selector๋ก ์ถ์ถํ ๋ฐ์ดํฐ๋ Item ๊ฐ์ฒด์ ๋ด๊ฒจ yield ๋๊ณ , ์ดํ Pipeline์ผ๋ก ์ ๋ฌ๋๋ค.
์ค์ ๋ฐ์ดํฐ ์ถ์ถ ๊ณผ์ ์์๋ ๋ธ๋ผ์ฐ์ ์ ์์ ๊ฒ์ฌ๋ฅผ ํตํด HTML ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ณ , ๊ฒ์๊ธ ํ ์ค์ ๊ฐ์ธ๋ tr ํ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ณต ์ฒ๋ฆฌํ๋ค. ๊ฐ tr ์์์ XPath๋ฅผ ์ด์ฉํด ์ ๋ชฉ, ๋งํฌ, ๋ ์ง, ์กฐํ์ ๋ฑ์ ํ๋์ฉ ์ถ์ถํด Item์ ์ฑ์ ๋ฃ๋๋ค.
pipelines.py
- ํฌ๋กค๋ง์ด ๋๋ ๋ค์ ํ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๋ด๋น
- ์ค๋ณต ๊ฒ์ฌ, ํํฐ๋ง, DB ์ ์ฅ ์์ ์ํ
- ์์ง → ๊ฐ๊ณต → ์ ์ฅ์ด ๋ช ํํ ๋ถ๋ฆฌ๋ ํ์ดํ๋ผ์ธ ๊ตฌ์กฐ
- ์ฌ๊ธฐ์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ฑฐ๋, ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์๋ค. ๋ํ ํน์ ์กฐ๊ฑด์ ๋ง์ง ์๋ ์์ดํ ์ ํํฐ๋งํด ๋ฒ๋ฆฌ๋ ๊ฒ๋ Pipeline์์ ์ฒ๋ฆฌํ๋ค.
- Pipeline์ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์คํ ์์๋ settings.py์์ ์ซ์๋ก ์ง์ ํ๋ค. ์ซ์๊ฐ ๋ฎ์์๋ก ๋จผ์ ์คํ๋๊ธฐ ๋๋ฌธ์, ์๋ฅผ ๋ค์ด “์ค๋ณต ์ ๊ฑฐ → DB ์ ์ฅ” ๊ฐ์ ์์๋ฅผ ๋ช ํํ ์ ์ดํ ์ ์๋ค.
- ํน์ ๋จ์ด๊ฐ ํฌํจ๋ ๊ฒ์๊ธ์ ํํฐ๋งํ๋ Pipeline์ ๋ง๋ค๊ณ , ๊ธ์ง ๋จ์ด ๋ชฉ๋ก์ ํด๋นํ๋ ์ ๋ชฉ์ด ๋ค์ด์ค๋ฉด DropItem ์์ธ๋ฅผ ๋ฐ์์์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฌ๋๋ก ๊ตฌํํ ์ ์๋ค.
ITEM_PIPELINES = {
"books_scraper.pipelines.BooksScraperPipeline": 300,
}
settings.py
- ํ๋ก์ ํธ ์ ์ฒด ์ค์
- ์ด๋ค Pipeline์ ์ฌ์ฉํ ์ง, ๋ก๊ทธ ํ์ผ์ ์ด๋์ ์ ์ฅํ ์ง, ๋ก๊ทธ ๋ ๋ฒจ์ ์ด๋ ์ ๋๋ก ํ ์ง
- ๋ก๊ทธ ํ์ผ์ ๊ฒฝ๋ก์ ๋ก๊ทธ ๋ ๋ฒจ ์ญ์ settings.py์์ ์ง์ ํ ์ ์์ผ๋ฉฐ
- ๋ก๊ทธ ๋ ๋ฒจ์ DEBUG, INFO, WARNING, ERROR, CRITICAL์ ๋จ๊ณ๋ก ๋๋๋ค.
LOG_LEVEL = "INFO"
scrapy.cfg
- ํ๋ก์ ํธ ๋ฐฐํฌ๋ ์คํ๊ณผ ๊ด๋ จ๋ ๋ฉํ ์ค์ ํ์ผ
- Scrapy๊ฐ ์ด ํ๋ก์ ํธ๋ฅผ ํ๋์ ์์ ๋จ์๋ก ์ธ์ํ๋๋ก ๋๋๋ค.
์ฐธ๊ณ
'๐ฆญ AI&Big Data > Big Data' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์คํ ๋ฆฌ์ง (1) | 2025.12.08 |
|---|---|
| ์นดํ์นด (0) | 2025.12.06 |
| ๋ฐ์ดํฐ ์์ง๋์ด๋ง (0) | 2025.10.03 |
| Airflow(4) (4) | 2025.07.17 |
| ๋ฐ์ดํฐ ์์ง๋์ด๋ง (2) | 2025.07.06 |