ํ์ด์ฌ ํฌ๋กค๋ง์ ๋ ๋น ๋ฅด๊ฒ ์ํํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ์ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- ๋น๋๊ธฐ ์ฒ๋ฆฌ(Asynchronous Processing) ์ฌ์ฉ: ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ ๋ค๋ฅธ ์ฝ๋ ์คํ์ ์ค๋จํ์ง ์๊ณ ๋ ๋ณ๋ ฌ๋ก ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ธฐ์ ์ ๋๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์น ์ฌ์ดํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, asyncio์ aiohttp ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ฉํฐ์ค๋ ๋ฉ ๋๋ ๋ฉํฐํ๋ก์ธ์ฑ ์ฌ์ฉ: ๋ฉํฐ์ค๋ ๋ฉ ๋๋ ๋ฉํฐํ๋ก์ธ์ฑ์ ์ฌ์ฉํ์ฌ CPU ๋ฐ I/O ๋ฐ์ด๋ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. CPU ๋ฐ์ด๋ ์์ ์ ๊ณ์ฐ ์ง์ฝ์ ์์ ์ผ๋ก์, ๋ฉํฐํ๋ก์ธ์ฑ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. I/O ๋ฐ์ด๋ ์์ ์ ๋คํธ์ํฌ ๋๋ ๋์คํฌ I/O์ ๋ํ ์์ ์ผ๋ก, ๋ฉํฐ์ค๋ ๋ฉ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์บ์ฑ ์ฌ์ฉ: ์บ์ฑ์ ์ด์ ์ ๊ฒ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ๋์ผํ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒฝ์ฐ, ๋ค์ ์์ฒญํ์ง ์๊ณ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ค์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Redis๋ Memcached์ ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ํ์ฑ ์๋ ๊ฐ์ : ํฌ๋กค๋ง์์ ๊ฐ์ฅ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ HTML ํ์ฑ์ ๋๋ค. ๋ฐ๋ผ์, ๋น ๋ฅธ ํ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ BeautifulSoup ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ์ฑ ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- User-Agent ํค๋ ์ค์ : User-Agent ํค๋๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ ๊ฐ์ผ๋ก, ์น ์ฌ์ดํธ์์ ์์ฒญ์ ๋ฐ์ ๋, ์์ฒญ์ด ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ํ ๊ฒ์ธ์ง, ์คํฌ๋ฆฝํธ์์ ๋ฐ์ํ ๊ฒ์ธ์ง ํ๋จํฉ๋๋ค. ์ผ๋ถ ์น ์ฌ์ดํธ๋ ์คํฌ๋ฆฝํธ์์์ ์์ฒญ์ ์ฐจ๋จํ๊ธฐ๋ ํ๋ฏ๋ก, User-Agent ํค๋๋ฅผ ์ค์ ํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญํ ๊ฒ์ผ๋ก ์ธ์ํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- HTTP ํค๋ ์ค์ : HTTP ์์ฒญ์ ๋ณด๋ผ ๋, Accept-Encoding, Accept-Language ๋ฑ์ ํค๋๋ฅผ ์ค์ ํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ง ์๊ณ , ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ๋๋ก ์ค์ ํ ์(HTTP Header Setting) ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ๋์ญํญ์ ์ค์ด๊ณ , ์๋ต ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
- ๋ถํ์ํ ์์ฒญ ์ ๊ฑฐ: ๋ถํ์ํ ์์ฒญ์ ์ ๊ฑฐํ์ฌ ๋คํธ์ํฌ ๋์ญํญ์ ์ค์ด๊ณ , ์๋ต ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, robots.txt ํ์ผ์ ์ํด ํฌ๋กค๋ง์ด ๊ธ์ง๋ ํ์ด์ง์ ๋ํด์๋ ์์ฒญ์ ๋ณด๋ด์ง ์์์ผ ํฉ๋๋ค. ๋ํ, ๋ก๋ด ๋ฐฉ์ง ํค๋๊ฐ ์ค์ ๋ ํ์ด์ง๋ ์์ฒญ์ ๋ณด๋ด์ง ์์์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ: ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๊ฒ์ด ๋น ๋ฅด๊ณ ํจ์จ์ ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ฒ์๊ณผ ํํฐ๋ง๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ MySQL, PostgreSQL, MongoDB, Redis ๋ฑ ๋ค์ํ ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
- ์ ์ ํ ๋๊ธฐ ์๊ฐ ์ค์ : ๋๋ฌด ๋น ๋ฅด๊ฒ ์์ฒญ์ ๋ณด๋ด๋ฉด ์น ์ฌ์ดํธ์์ ์คํฌ๋ํ์ ๊ฐ์งํ๊ณ , IP ์ฃผ์๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ ์ ํ ๋๊ธฐ ์๊ฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ๋๊ธฐ ์๊ฐ์ ์์ฒญ ์ฌ์ด์ ๋ฌด์์๋ก ์๊ฐ์ ๋ผ์๋ฃ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ์ ์ ํ ํ์ฉํ๋ฉด ํ์ด์ฌ ํฌ๋กค๋ง ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
1. requests.get ํค๋ ์ถ๊ฐ(User-Agent, Connection)
headers = {
"User-Agent": "Mozilla/5.0 (X11; CrOS x86_64 12871.102.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36",
"Connection": "close"}
response = requests.get(url_text, headers=headers)
ํค๋์ ๋ฌด | Process ์ | ์์์๊ฐ |
No header | process=4 | 2376์ด (39๋ถ) |
Yes header | process=4 | 1650์ด (26๋ถ) |
2. ๋ฉํฐํ๋ก์ธ์ฑ ์ ์ฉ
if __name__ == '__main__':
# ํ๋ก์ธ์ค ์ ์กฐ์
pool = multiprocessing.Pool(processes=4)
# data_collect๋ str ํ๊ฐ์ฉ ๋ฐ์์ ์ฒ๋ฆฌํ๋ค / out_list์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๋๊ฒจ์ค๋ค
pool.map(data_collect, out_list)
pool.close()
pool.join()
process ์ | ์์์๊ฐ |
4 | 1650์ด(26๋ถ) |
8 | 632์ด (10๋ถ) |
32 | 177์ด (3๋ถ) |
60 | 120์ด (2๋ถ) |
* ์ฃผ์์ฌํญ
ํฌ๋กค๋ง ๋์์์ ๋คํธ์ํฌ ๋ณด์์ฅ๋น ์กด์ฌํ์ฌ ์ผ์ ๋๋ ์๊ตฌ์ ์ฐจ๋จ์ด ๋ ์ ์์ผ๋ฏ๋ก ์ ์ ํ ์์ฒญ ๋น๋ ๋ฐ ํ๋ก์ธ์ค ์๋ฅผ ์ค์ ํด์ผ ํจ
๋น ๋ฅธ์๋๋ก ์ธํ์ฌ requests ๋๋ฝ๋๋ ๊ฑด์ด ์์ผ๋ฏ๋ก 3๋ฒ์ ๋๋ ์ค๋ณต์ฒดํฌํ์ฌ ๋ค์๋๋ ค์ผ ํจ
'๐ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ด์ฌ] pyinstaller๋ก ์๋์ฐ ๋ฆฌ๋ ์ค ์คํํ์ผ ๋ง๋ค๊ธฐ (0) | 2022.06.08 |
---|---|
[ํ์ด์ฌ] ๋ฐ์ดํฐ ์กฐํ ์๋ ๊ฐ์ (0) | 2022.06.03 |
[ํ์ด์ฌ] ํ๋ก์ธ์ค ํธ๋ค๋ง (0) | 2022.05.26 |
[ํ์ด์ฌ] win32com outlook ์๋ ๋ฉ์ผ ์ฒ๋ฆฌ (0) | 2022.03.04 |
[ํ์ด์ฌ] Request ๋ชจ๋ ์์ธ์ฒ๋ฆฌ ๋ฆฌ์คํธ (0) | 2021.04.20 |