๋ค์ด๋ฒ ๋ด์ค ํฌ๋กค๋ง ํ์ด์ง
์ด์ ๊ธ์์ ๋ค์ด๋ฒ๋ด์ค ํํ์ด์ง์ ์ ๋ชฉ ํฌ๋กค๋ง์ ์งํํ๋ค.
ํ์ง๋ง, ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๋ ํ์ํ ์์ง๋ฐ์ดํฐ๋ ํํ์ด์ง๊ฐ ์๋๋ผ ์ฌ๋ฌํ์ด์ง์ ๋ด์ฉ์ ์์งํด์ผํ๋ค.
๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
url request์์ฒญ์ ๋ฐ๋ณต๋ฌธ์ ํตํด์ ๋ฐ์์์ผ ํ๋ค.
ํ์ฌ ๋ค์ด๋ฒ์ url ํ์์ ๋ณด๋ฉด page๊ฐ ์๋ ๊ฒ์๊ธ์ ์์ ์ง์ ์ start๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ค๊ณ ์๋ค.

๋ค์ด๋ฒ ๋ด์ค ํฌ๋กค๋ง multiprocessing(X)
1๋ฒ์งธ ๊ฒ์๋ฌผ๋ถํฐ 300๋ฒ์งธ๊น์ง ์ด 30๋ฒ์ ๊ฑธ์ณ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
time๋ชจ๋์ ์ฌ์ฉํด์ ๋ฐ์์ค๋ ์๊ฐ๊น์ง ํ์ธํ๋ค.
from bs4 import BeautifulSoup
import requests
import time
search_word = "์ผ์ฑ" #๊ฒ์์ด ์ง์
start = 1
end = 300 #๋ง์ง๋ง ๋ด์ค ์ง์
title_list = []
if __name__ == '__main__':
start_time = time.time()
while 1:
if start > end:
break
print(start)
url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}&start={}'.format(search_word,start)
req = requests.get(url)
#์ ์์ ์ธ request ํ์ธ
if req.ok:
html = req.text
soup = BeautifulSoup(html,'html.parser')
#๋ด์ค์ ๋ชฉ ๋ฝ์์ค๊ธฐ
titles = soup.select(
'ul.type01 > li > dl > dt > a'
)
#list์ ๋ฃ์ด์ค๋ค
for title in titles:
title_list.append(title['title'])
start += 10
print(title_list)
print("์คํ ์๊ฐ : %s์ด" % (time.time() - start_time))
multiprocessing(X) ๊ฒฐ๊ณผ
๋๋ 30๋ฒ์ ์นํ์ด์ง ๋ฐ์ดํฐ์์ง์ผ๋ก 300๊ฐ์ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ฐ 21์ด์ ๋๊ฐ ๊ฑธ๋ ธ๋ค.
๋๋ฌด ๋๋ฆฌ๋ค.
์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ๋๋ ์๋ง ์์ญ๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ทจ๊ธํ๋๋ฐ ๊ณ ์ 300๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ฐ 21์ด๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ์๊ฐ๋ญ๋น๋ค.

๋ค์ด๋ฒ ๋ด์ค ํฌ๋กค๋ง multiprocessing(O)
์๋๋ ๋ฉํฐํ๋ก์ธ์ฑ์ ์ฌ์ฉํ ์ฝ๋์ด๋ค.
multiprocessing์ Pool๊ณผ Manager๋ฅผ ์ฌ์ฉํ๋ค.
Pool
- ๊ฐ์ process์ ๋ถ๋ฐฐํ์ฌ ๋ณ๋ ฌํํ์ฌ ํจ์์คํํ๋ค.
-map ํจ์๋ฅผ ์ฌ์ฉํ์ฌ (ํจ์,ํจ์์ ์ธ์๋ก ์ฌ์ฉํ ๊ฐ๋ค) ํํ์ ์ธ์๋ฅผ ์ฌ์ฉ
Manager
-global๊ฐ์ ๊ณต์ ํ๊ธฐ ์ํ์ฌ Manager ์ฌ์ฉ
-Manager list๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ต์ข
๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์์ด ๋น ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
์ด๋ multiprocessing๋๋ฉด์ ๊ฐ์ global์ ์ญ ๋ณ์๋ฅผ ๋ฐ๋ผ๋ณด์ง ์๊ธฐ๋๋ฌธ์ ๋ฐ์ํ๋ ํ์์ด๋ค.
Manager์ listํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ Shared๋ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก๋ณด๋๋ก ํ๋ค.
from bs4 import BeautifulSoup
import requests
import time
from multiprocessing import Pool, Manager
search_word = "์ผ์ฑ" #๊ฒ์์ด ์ง์
end = 300 #๋ง์ง๋ง ๋ด์ค ์ง์
#list๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด
manager = Manager()
title_list = manager.list()
def title_to_list(start):
global title_list
#url making
url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}&start={}'.format(search_word,start)
req = requests.get(url)
#์ ์์ ์ธ request ํ์ธ
if req.ok:
html = req.text
soup = BeautifulSoup(html,'html.parser')
#๋ด์ค์ ๋ชฉ ๋ฝ์์ค๊ธฐ
titles = soup.select(
'ul.type01 > li > dl > dt > a'
)
#list์ ๋ฃ์ด์ค๋ค
for title in titles:
title_list.append(title['title'])
if __name__ == '__main__':
start_time = time.time()
pool = Pool(processes=4) #4๊ฐ์ ํ๋ก์ธ์ค ๋์์ ์๋
pool.map(title_to_list,range(1,end,10)) #title_to_list๋ผ๋ ํจ์์ 1 ~ end๊น์ง 10์ฉ๋๋ ค๊ฐ๋ฉฐ ์ธ์๋ก ์ ์ฉ
print(title_list)
print("์คํ ์๊ฐ : %s์ด" % (time.time() - start_time))
multiprocessing(O) ๊ฒฐ๊ณผ
4๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋กค๋ง์ ํ ๊ฒฐ๊ณผ 300๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ฐ 6์ด ์ ๋์ ์๊ฐ์ด ์์๋ฌ๋ค.
22์ด -> 6์ด ๋๋ต 4๋ฐฐ์ ๋์ ์๊ฐ์ด ์ ๊ฐ๋์๋ค.

๋๊ธ