네이버 지도 / 카카오맵 크롤링 트러블슈팅

Doyeon·2023년 3월 14일
0
post-thumbnail

네이버 지도와 카카오맵을 크롤링하는 과정에서 발생한 문제들을 기록합니다.
1. Java + 네이버 지도 크롤링
2. Python + 네이버 지도 크롤링
3. Python + 카카오맵 크롤링


#1. Chromedriver 실행 시 오류 : ‘chromedriver’은(는) Apple에서 악성 소프트웨어가 있는지 확인할 수 없기 때문에 열 수 없습니다.

원인

  • macOS는 다운로드 한 파일에 대해 quarantine 이라는 보안 기능을 사용한다.
  • quarantine 은 파일이 다운로드 된 웹 사이트와 연관된 정보를 저장하고, 실행되기 전에 사용자에게 경고를 표시하거나 실행을 차단한다.

해결

  • Chromedriver 실행 파일에서 quarantine 속성을 제거한다.
    // Chromedriver 파일 위치에서 실행한다.
    
    xattr -d com.apple.quarantine chromedriver

#2. Java 프로젝트 실행 시 Chromedriver 에러 : **Resolve java.io.IOException: Invalid Status code=403 text=Forbidden in Chromedriver | Selenium**

2023-03-11 22:51:30.328  INFO 38080 --- [ null to remote] o.o.selenium.remote.ProtocolHandshake    : Detected dialect: W3C
2023-03-11 22:51:30.371  WARN 38080 --- [cHttpClient-1-4] o.openqa.selenium.remote.http.WebSocket  : Invalid Status code=403 text=Forbidden

java.io.IOException: Invalid Status code=403 text=Forbidden

원인

  • Chromedriver가 원격으로 연결된 Chrome 브라우저에서 URL에 액세스할 권한이 없기 때문에 발생한다.

해결

  • Chrome 브라우저의 보안 설정을 변경한다.
  • 원격으로 제어되는 브라우저에서 모든 요청을 수락하도록 허용한다. 보안상의 위험이 있지만, 로컬 개발 환경에서 테스트할 때는 유용하다.
// 크롬 드라이버 세팅 (드라이버 설치 경로 입력)
System.setProperty("webdriver.chrome.driver", "/Users/doyeonkim/Downloads/chromedriver_mac_arm64/chromedriver");

**// 보안설정 추가
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");**

// 브라우저 선택
driver = new ChromeDriver(options);

#3. 장소 목록 하나씩 크롤링 시, Exception 발생

장소 목록 리스트를 하나씩 크롤링하는데, 첫번째 목록은 성공, 그 다음 목록은 exception, 그 다음은 성공, 그 다음은 exception으로 하나 건너 error가 발생한다.

[크롤링 시작...]
0
야당역환승 주차장
도로명 주소: 경기 파주시 소리천로 14
지번 주소: 야당동 1087복사우
우편번호
10908
야당역환승 주차장 ...완료
1
야당역 공영 주차장
Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class="jg1ED"]/div[1]"}
(Session info: chrome=111.0.5563.64)

ERROR!ERROR!ERROR!
야당역 공영 주차장 ...완료
2
유은타워5차주차장
도로명 주소: 경기 파주시 소리천로 29
지번 주소: 야당동 1085복사우
우편번호
10908
유은타워5차주차장 ...완료
3
삼융타워 주차장
Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class="jg1ED"]/div[1]"}
(Session info: chrome=111.0.5563.64)

ERROR!ERROR!ERROR!
삼융타워 주차장 ...완료
4
유은타워3차 주차장

에러 메시지를 보면, 똑같은 코드를 반복하는데 하나는 element를 제대로 찾고 그 다음 턴에서는 element를 못 찾는다고 한다.

시도1

  • element 찾기 전에 sleep 시간 주기
# 주차장명 가져오기
parking_name = page[data].text
print(parking_name)

sleep(1)

address_buttons = driver.find_elements(By.XPATH, '//span[@class="Q8Zql"]/a[@role="button"]')
address_buttons.__getitem__(data).click()

**sleep(1)**

addr1 = driver.find_element(By.XPATH, '//div[@class="jg1ED"]/div[1]')

→ sleep 시간을 길게 주었는데도 에러는 똑같이 발생한다.

시도2

  • find_element(By.CSS_SELECTOR) 로 찾기
parking_name = page[data].text
print(parking_name)

sleep(1)

address_buttons = driver.find_elements(By.XPATH, '//span[@class="Q8Zql"]/a[@role="button"]')
address_buttons.__getitem__(data).click()

sleep(2)

**addr = driver.find_elements(By.CSS_SELECTOR, '.jg1ED > div')**

# 도로명
road = addr.__getitem__(0).text
road_address = road[3:(len(road) - 2)]
print("도로명 주소:", road_address)

# 지번
jibun = addr.__getitem__(1).text
jibun_address = jibun[2:(len(jibun) - 2)]
print("지번 주소:", jibun_address)

→ By.CSS_SELECTOR 로 찾으니 exception 없이 잘 찾는다.

해결

  • 주소 버튼 클릭 전에 sleep(1) 시간을 준다. (sleep이 없으면 주소 정보 창 열리는데 시간이 걸려서 element를 못 찾는다.)
  • By.XPATH 대신 By.CSS_SELECTOR를 사용한다.

XPath vs. CSS Selector

  • XPath는 복잡한 쿼리를 작성할 수 있고, CSS Selector는 간결하고 직관적인 쿼리를 작성할 수 있다.
  • XPath는 각 브라우저에 따라 다르게 동작할 수 있지만, CSS Selector는 일관성 있게 동작한다.
    → XPath를 사용해야만 하는 복잡한 쿼리가 필요한 경우가 아니라면, CSS Selector를 사용하여 element를 찾자!
profile
🔥

0개의 댓글