聰明不如鈍筆
총명불여둔필
assignment KindeR

ggmap '404 forbidden' 에러 해결하기


ggmap 패키지를 사용한 이 포스트이 포스트에 코드를 따라 했는데 '403 forbidden' 에러가 난다고 댓글을 쓴 분들이 계십니다.


위키피디아 한국어판은 이 에러를 "서버가 허용하지 않는 웹 페이지나 미디어를 사용자가 요청할 때 웹 서버가 반환하는 HTTP 상태 코드"라고 설명합니다.


한 마디로 '접근을 시도했지만 금지당했다'는 게 바로 403 forbidden입니다. (영어 낱말 'forbid'가 '금지하다'는 뜻입니다.)


ggmap은 구글 지도에서 데이터를 가져오는 방식으로 작동합니다.


그런데 최근 구글에서 지도 자료를 공급하는 방식을 바꿨습니다. 따라서 ggmap도 새로운 방식으로 데이터를 받아 와야 합니다.


문제는 R 공식 패키지 저장소인 CRAN(The Comprehensive R Archive Network)에 있는 최신 버전(2.6.1)에도 아직 이 기능이 들어 있지 않다는 것. 그래서 자꾸 에러 메시지가 나오는 겁니다.


그렇다고 해결책이 없는 건 아닙니다. 깃허브에는 2.7 버전이 올라와 있기 때문입니다. 이 버전을 내려받아 설치하는 게 에러에서 벗어나는 첫 번째 단계입니다.


깃허브에 있는 패키지 파일을 내려받아 설치하려면 devtools 패키지에 들어 있는 install_github() 함수를 쓰면 됩니다. 아래 코드를 실행하시면 R가 여러분 컴퓨터에 ggmap 2.7을 설치하고 불러들입니다.

install.packages('devtools')
library('devtools')
install_github('dkahle/ggmap')
library('ggmap')
## Loading required package: ggplot2
## Google Maps API Terms of Service: http://developers.google.com/maps/terms.
## Please cite ggmap if you use it: see citation("ggmap") for details.


어라? 실행 결과에 '구글 지도(Google Maps) API 이용 약관'이라는 표현이 등장합니다.


API는 'Application Programming Interface'를 줄인 말로 흔히 '응용 프로그램 프로그래밍 인터페이스'라고 번역합니다. 이때 인터페이스는 사용자가 어떤 동작을 쉽게 할 수 있도록 도움을 주는 시스템이라고 생각하시면 됩니다.


그러니까 구글 지도 API는 구글 지도를 쉽게 작동할 수 있도록 도움을 주는 시스템입니다.


이런 API에 접근하려면 인증키(key)가 필요합니다.


구글 지도 API 키는 이 페이지에서 발급받으실 수 있습니다. 링크를 클릭하시면 아래 제품 선택 화면이 나오는데 세 가지를 모두 선택합니다.



다음 단계는 프로젝트 이름 입력하기. 저는 그냥 'my ggmap'이라는 이름으로 프로젝트를 만들었습니다.



여기까지 진행하시면 결제 계정을 만들어야 한다는 화면이 나옵니다. 기본적으로 구글 지도 API는 무료지만 신용카드 정보를 입력하셔야 합니다.


단, 나중에 이용 실적에 따라 구글에서 과금을 하게 되니 가격표를 확인해 보시는 것도 좋을 듯합니다.



결제 정보 입력이 모두 끝나고 몇 번 더 '다음'을 클릭하시면 아래 화면처럼 API 키를 발급받을 수 있습니다.



키를 발급받으셨으면 다시 R로 돌아오셔서 register_google() 함수를 써서 이 키를 등록합니다.

register_google(key='자기 인증키')


그 다음 '크롤링부터 시각화까지…R 데이터 분석 실제로 어떻게?' 포스트에 들어 있는 아래 코드를 실행하시면 잘 작동하는 걸 확인할 수 있습니다.

library('rvest')

html.airports <- read_html('https://en.wikipedia.org/wiki/List_of_busiest_airports_by_passenger_traffic')
df <- html_table(html_nodes(html.airports, 'table')[[1]], fill = TRUE)

colnames(df)[6] <- 'total'
df$total <- gsub('\\[[0-9]+\\]', '', df$total)
df$total <- gsub(',', '', df$total)
df$total <- as.numeric(df$total)

gc <- geocode(df$Airport)
df <- cbind(df, gc)

world <- map_data('world')
ggplot(df, aes(x=lon, y=lat)) +
  geom_polygon(data=world, aes(x=long, y=lat, group=group), fill='grey75', color='grey70') + 
  geom_point(color='dark red', alpha=.25, aes(size=total)) +
  geom_point(color='dark red', alpha=.75, shape=1, aes(size=total)) +
  theme(legend.position='none')


여태 ggmap으로 지도 잘 그렸는데 갑자기 에러 메시지 공세에 시달렸다고 생각하시는 분들께 도움이 되었으면 좋겠습니다.


혹시 이 포스트에 이해가 가지 않거나 잘못된 부분이 있으면 언제든 알려주세요. 같이 공부하면서 바로잡도록 하겠습니다.


댓글,

KindeR | 카테고리 다른 글 더 보기