์ฒ์์๋ 1ํ์ด์ง์ ์์์ ์ ๋ณด๋ง ํฌ๋กค๋งํด์ค๋ค ์๋ฅผ ๋๋ ค ๋ง์ง๋ง ํ์ด์ง์ ์ถฉ๋ฌด๋ก ์์์ ๊น์ง ๋ชจ๋ ํฌ๋กค๋งํด์ค๊ธฐ๋ก ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฝ๋๋ฅผ ๋๋ฆฌ๋๋ฐ 2ํ์ด์ง๋ถํฐ ์ ์ ๋๋ ค์ง๋๋ ๊ธ๊ธฐ์ผ ๊ฑฐ์ ๋ฉ์ถ๋ฏํ ์์ ์๋๋ฅผ ๋ณด์๋ค.
ํ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ ์์๋ค. ์์ ๋ฌธ์ ๋ฅผ ํ์ธํ๋ ์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ธํด๋ดค๋๋ฐ 3ํ์ด์ง๋ฅผ ์ฝ์ด์ค๋๋ฐ 3G๊ฐ ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง๊ฐ ๋์ด๋ ์๋ก ์ ์ ๋์๋ค. Selenium์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ์๊ณ ์์์ง๋ง ์ด์ ๋๋ ๋ฌธ์ ๊ฐ ์์ด๋ณด์ธ๋ค. ๋ํ ํ์ฌ ์๋ฒ ์คํ์ผ๋ก 3G๊ฐ ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.


๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํค๊ณ ํ์ธํ๋ค๋ณด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์คฌ๋ค. ๋ต์ ์ค๋ง๋ฆฌ๋ฅผ ์ป์ ์ ์์๊น ์ถ์ด heap snapshot์ ํ์ธํด๋ณด๋ ค๊ณ ํ๋๋ฐ,

์๋ชป๋ณธ ์ค ์์๋ค. heap snapshot์ ์ฐ์ผ๋ ค๊ณ ๋ณด๋ 16G๊น์ง ๊ฐ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์น์์์ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๋ค. ํ์ง๋ง ๋ฐ๋ณต์ ์ผ๋ก DOM์ด๋ผ๋ ํค์๋๋ฅผ ํ์ธํ ์ ์์๊ณ , DOM ์์๊ฐ ๋๋ฌด ๋ง์ด ๋์ ๋์ด ๋๋ ค์ง๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๊ฐ์ฅ ๊ฐ๋จํด๋ณด์ด๋ ํด๊ฒฐ์ฑ ์ ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์์ฒด๋ฅผ ์ข ๋ฃํ๋ค๊ฐ ์ฌ์คํํ๋ ๊ฒ์ด๋ค.
# ์์
ํ ๋๋ผ์ด๋ฒ ์ข
๋ฃ
driver.quit()
# ์ฌ์คํ
driver = get_driver();

ํ์ง๋ง ๋๋ผ์ด๋ฒ๋ฅผ ์๋ก ์์ฑํ๋ฉด ๋ค์ด๋ฒ์์ 429์๋ฌ, ToomanyRequest๋ฅผ ๋ณด๋ธ๋ค. ํ์ธํด๋ณด๋ 3๋ถ์ ๋ ์ง๋๊ณ ๋ค์ ์คํํ๋ฉด ์ ์ ๋์ํ๋ค. 3๋ถ๋ง๋ค ํฌ๋กค๋งํ ๊น ๊ณ ๋ฏผํ๋ค๊ฐ ํ ๋ฒ์ ํฌ๋กค๋งํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์ถ์๋ค.
๋ค์ ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ณด๋ค proxy๋ฅผ ์ฌ์ฉํด 429 ์๋ฌ๋ฅผ ์ฐํํ๋ ๊ธ์ ๋ณด์๋ค. 429 ํ๋จ ๊ธฐ์ค์ด ํน์ IP์์ ์ง์๋ ์์ฒญ์ ๋ณด๋์ ๋๋ผ๊ณ ๊ฐ์ ํ๊ณ proxy๋ฅผ ํตํด IP๋ฅผ ์์ด๋ ๊ฒ์ด๋ค.
ํ๋ก์๋ฅผ ๋ฌด๋ฃ๋ก ์ ๊ณตํด์ฃผ๋ ์ฌ์ดํธ์์ ํ๋ก์๋ฅผ ๊ฐ์ ธ์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค. ํ์ง๋ง ์๋๊ฐ ๋๋ฌด ๋๋ ธ๊ณ ์ธ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ถ์์ ํ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ค๊ฐ Tor ๋ธ๋ผ์ฐ์ ์ ์๊ฒ ๋์๋ค. Tor ๋ธ๋ผ์ฐ์ ๋ ๋คํธ์ํฌ ์ฐํ๋ฅผ ํตํด ์ต๋ช ์ฑ์ ๋ณด์ฅํ๋ ๋คํธ์ํฌ์ด๊ณ proxy์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
Tor ๋ธ๋ผ์ฐ์ ๋ฅผ ๊น๊ณ ์๋ํด๋ณด์์ผ๋ ์ด๋ํ ์๋๊ฐ ๋๋ฌด ๋๋ฆฌ๋ค๋ ๋ฌธ์ ๊ฐ ์์๋ค. 1ํ์ด์ง์ ์๋น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ๊ธฐ์กด์ chrome ๋ธ๋ผ์ฐ์ ๋ 2๋ถ, Tor๋ฅผ ์ฌ์ฉํ๋ฉด 11๋ถ์ด ๊ฑธ๋ ธ๋ค. ์ฌ๋ฌ ๊ตญ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ๊ฒฝ์ ํ์ฌ ๊ฐ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋๋ฆฌ๋ค๊ณ ํ๋ค.

๐ย ์ฐธ๊ณ
https://jakpentest.tistory.com/entry/Seleinum-Proxy%EC%99%80-OSX%EC%97%90%EC%84%9C-Selenium%EC%9C%BC%EB%A1%9C-Tor-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
https://dundung.tistory.com/248
https://real1004zz.tistory.com/224
https://peanut159357.tistory.com/2
๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ ๊ณ ๋ฏผ์ ํด๋ณด์๋ค.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ์์ธ๋ค โ ๋๋ผ์ด๋ฒ ์ข ๋ฃ๋ก๋ ํด๊ฒฐ์ด ์ ๋๋ค โ ์ฐฝ ๊ป๋ค ํค๋ ๊ฒ์?
์ด๋ฐ ์ฌ๊ณ ์ ํ๋ฆ์ผ๋ก ์๋ก์ด ์ฐฝ์ ๋์ ๋ค ๋๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
def crawling_restaurants(url):
driver = get_driver()
driver.get(url)
WebDriverWait(driver, 60).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "searchIframe")))
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".place_on_pcmap #app-root .zRM9F")))
main_tab = driver.current_window_handle
for page in range(5):
driver.execute_script("window.open('');") // ๐ ์๋ก์ด ์ฐฝ ๊ป๋ค ํค๊ธฐ
driver.switch_to.window(driver.window_handles[-1])
driver.get(url)
WebDriverWait(driver, 60).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "searchIframe")))
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".place_on_pcmap #app-root .zRM9F")))
...
driver.close()
driver.switch_to.window(main_tab)
driver.quit
return restaurants_info
๊ฒฐ๊ณผ๊ฐ ๋์์ง ์๋ค.
์ด์ ์๋ 3ํ์ด์ง๋ง ๋์ด๊ฐ๋ ๊ธ๊ฒฉํ ๋๋ ค์ง๋ ์๋๊ฐ ์ผ์ ํ๊ฒ ์ ์ง๋์๊ณ , 3G๋ฅผ ํฌ๊ฒ ๋์ง ์๋ ์ ์์ ํฌ๋กค๋ง์ ๋ง๋ฌด๋ฆฌํ์๋ค.
| ์ด์ ๋ฐฉ์ | ์๋ก์ด ๋ฐฉ์(ํ์ด์ง๋ง๋ค ์ฐฝ ๊ป๋ค ํค๊ธฐ) |
|---|---|
![]() |
![]() |
์ข ๋ ์์ธํ๊ฒ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๊ณ ์ถ์ด ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ ํ์คํ ๋ง์ง๋ง ๋ฐฉ์์ด ํจ๊ณผ๊ฐ ์์๋ค. ์ฌ์ง์ด ์ฒซ๋ฒ์งธ ๋ฐฉ์์ 600์ด๊ฐ ๋๋๋ก 3ํ์ด์ง์ ๋จธ๋ฌผ๋ฌ ์์ด์ ์ค๊ฐ์ ๋์๋ค.
์ง๊ธ ์๊ฐํด๋ณด๋ ๋์์ค๋ ๊ธธ์ ๊ธธ์์ง๋ง ์๊ฐ๋ณด๋ค ๋จ์ํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ๋ ๋ฏ ์ถ๋ค.
์ด๋ก์จ ๋ฉฐ์น ๊ฐ์ ์ฝ์ง ๋ ~
ํ์ฌ 429์ ๋ฌ ์๋จ๊ณ ์ ๋์๋์?