잘 돌아가던 크롤링 코드에 일부 정보를 더 가져오는 코드를 추가했더니 크롤링 중이던 크롬 화면에서 이런 오류가 발생하며 멈췄다.
크롬에서 메모리가 많이 쌓일 경우, Out Of Memory 가 발생한다. Chrome 브라우저가 저장하고 있는 쿠키, 캐시 등 인터넷 검색을 하면서 쌓인 데이터 때문에 나타나는 경우가 잦다.
Out Of Memory인 줄 모르고, 단순히 페이지가 로딩이 안된 줄만 알았다.if page_no '4':
time.sleep(1200)
결과는 똑같았다.
이 문제가 아니었으니까
out of memory에 대해 검색해 보니, 크롬 브라우저를 사용시에 이런 문제가 발생하는 것으로 확인되었다.options.add_argument("--incognito") # 시크릿모드
이걸로는 해결되지 않았다.
driver.get("chrome://settings/clearBrowserData") # 구글 브라우저 인터넷 사용기록 삭제 창이 뜨게 함
이걸로도...해결되지 않았다.
네이버 지도는(항상 최대 5페이지까지 결과를 제공한다. 1~4페이지는 광고 제외 70개, 5페이지는 20개 정도) 같은 검색어로 검색하더라도 검색 시마다 결과가 바뀌기에 특정 기점에 데이터를 저장하고 브라우저를 끌 수가 없었다. 그래서 현재 페이지의 내용을 다 돌았을 경우에 수집한 내용들을 csv파일에 전부 저장시키고 저장된 값들을 모두 비운 다음, 다음 페이지로 넘어가는 과정을 반복했다.
for index, e in enumerate(restaurant_elements, start=1)
stores_info = {
'name': name,
# 등등 필요한 정보
}
stores.append(stores_info)
if stores:
df = pd.DataFrame(stores)
df.to_csv('식당 데이터.csv', mode='a', encoding='utf-8-sig', index=False)
print('파일이 저장되었습니다')
del stores
stores = []
mode='a'인 경우 파일을 열어서 기존 데이터 뒤에 새로운 데이터를 추가하고, 만약 파일이 없다면 새로 생성한다. 기존의 내용을 지우지 않고, 새로운 내용을 추가할 때 사용한다.
이렇게 코드를 바꾸면 일단 4페이지에서 크롤링이 멈추더라도 3페이지까지 본 내용들은 전부 저장되므로 데이터의 3분의 2 정도는 살릴 수 있었다. 그리고 실행 결과, ...이걸로도 해결되지 않았다.
out of memory 이슈의 경우 드라이버를 종료하는 것이 유일한 해결책이라는 글을 보았다.크롬 드라이버의 특정 버전에 그런 이슈가 있었다는 글도 보았지만 내가 사용하는 버전(현재 기준 최신인 128)에 해당하는 얘기는 없었다. 네이버 지도 검색 특성상, 같은 검색어일지라도 동일한 가게들만 조회되지 않기 때문에 드라이버를 종료하고 싶지 않았다... 그러나 오류로 인한 데이터 손실을 최소화하려면 이게 유일한 방법 같았다.
if page_no == '4':
driver.quit()
driver = webdriver.Chrome(service=service, options=options)
driver.maxmize_window()
URL = '필요한 주소'
driver.get(URL)
이렇게 수정하니까 out of memory 오류 없이 정상적으로 작동되는 것을 확인할 수 있었다. 나는 동일한 검색어로 검색하더라도 매번 검색 결과가 달라지는 경우였기 때문에 돌고돌아 이 방법을 채택했지만, 아니라면 이 방법부터 시도해보길 바란다.
크롤링으로 대용량의 데이터를 가져오는 경우에는 메모리 과부하가 올 수 있으니 끊어서 실행해야한다는 점을 배울 수 있는 기회였다.