[Python] 네이버 검색 API로 데이터 불러 오기
1. 웹 크롤링의 기본, API
나보다 먼저 잠깐 코딩 세계에 발을 들였던 친구에게 언젠가 물었던 적이 있다.
"어땠어, 재밌었어?"
"그냥.. 웹 크롤링 정돈 할 수 있어 이젠"
(그리고 그녀는 호다닥 이 세계에서 발을 빼고 말았지 ㅋㅋㅋㅋ)
파이썬 입문 4주차, 나도 크롤링이라는 걸 해보았다.
먼저 API가 뭔지 알아보자.(설명 들었는데 기억 안남)
API란?
Application Programming Interface의 약자로,
운영체제나 시스템, 애플리케이션, 라이브러리 등을 활용해 응용 프로그램을 작성할 수 있게 하는 다양한 인터페이스를 의미.
오픈 API란?
API 중에서 플랫폼의 기능 또는 콘텐츠를 외부에서 웹 프로토콜(HTTP)로 호출해 사용할 수 있게 개방(open)한 API를 의미.
네이버 개발자센터에서 제공하고 있는 지도, 검색을 비롯 기계 번역, 캡차, 단축 URL 등 대부분 API는 HTTP로 호출할 수 있는 오픈 API에 해당.
출처: Naver Develpers 용어정리
음 그렇군.
대충 웹사이트에서 제공하는 정보를 외부에서 호출할 수 있게 해주는 거라는 것 같다.
웹 스크래핑을 하려면 각 웹사이트에서 API 키를 발급받아야 한다.
Naver에서는 Naver Developers에서 클라이언트 id와 secret을 발급 받아야 하고,
공공데이터포털에서는 각 오픈 API 활용 신청을 해야한다!
나는 네이버 API를 신청해 보았다.
2. 사용 모듈: Requests
일단 네이버 샘플 코드는 urllib을 이용한다.
주어진 샘플 코드를 따라가면 무리 없이 정보를 불러올 수 있다.
하지만 배웠던 모듈은 Requests였어서 이걸 활용해 보고 싶었다.
3. 삽질 코드
import requests
from pprint import pprint
def who_contributed(movie):
#요청하기
client_id = 'anallyajyum'
client_secret = 'bimiliya'
movie_params = {
'query' : movie
}
url = 'https://openapi.naver.com/v1/search/movie' #json
nv_headers = {'X-Naver-Client-Id' : client_id, 'X-Naver-Client-Secret': client_secret} #headers 설정
#크롤링 내용 변수에 저장
movie_info = requests.get(url, params = movie_params, headers = nv_headers) #get 매서드 활용
return movie_info.url
print(who_contributed('기생충'))
네이버 API 크롤링의 관건은 headers 사용이었다.
학습할 때 사용했던 API는 API 인증 번호를 직접 입력하는 방식이었기 때문에 headers가 필요 없었기 때문이다.
네이버 예시코드 보면서 headers가 뭔지 파악하고
requests 모듈만 써서 headers까지 작성한 후에
직접 데이터들 보면서 어떻게 생긴 구조인지, 뭘 뽑아낼 지 생각해 보려고 .url 을 리턴했다.
그런데..
생성된 url을 따라가면 보이는 화면 상태가 왜이래?
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ^^
Client ID와 Secret은 예시코드 따라했을 때 잘만 먹혔던 그 코드인데 왜 인증에 실패하는 것인가..
그 해답은 아주 허무하고도 간단한 것이었다.
4. 최종 코드
import requests
from pprint import pprint
def who_contributed(movie):
#요청하기
client_id = 'anallyajyum'
client_secret = 'bimiliya'
movie_params = {
'query' : movie
}
url = 'https://openapi.naver.com/v1/search/movie' #json
nv_headers = {'X-Naver-Client-Id' : client_id, 'X-Naver-Client-Secret': client_secret} #headers 설정
#크롤링 내용 변수에 저장
movie_info = requests.get(url, params = movie_params, headers = nv_headers) #get 매서드 활용
return movie_info.text
print(who_contributed('기생충'))
삽질 코드와 달라진 것 : .url → .text
.url은 새로운 링크를 생성해 데이터를 확인하는 것이고
.text는 콘솔창을 통해 데이터를 확인하는 것이다.
얼핏 같아 보이는 두 과정은 실은 중요한 차이가 있었다.
.url을 통해 반환된 주소는 사실상 새로운 요청을 보내는 것이고,
이 요청에는 헤더가 포함되어 있지 않기 때문에 인증 실패가 뜨는 것이다.
(thx to 스승님)
나는... 벽이랑 열심히 싸우고 있었던 것...ㅋㅋㅋㅋㅋㅋㅋ
좋은 승부였고, 좋은 배움이었다. ^^!
아직 이 넓디 넓은 개발 세계에서 나는 덜 말랑한 뇌를 가진 것 같다.
더 깨어지고 유연해지거라 나의 뇌여...☆
5. 여담
1일 1솔하면서 기술 블로그 깨우러 왔더니
임시저장된 이 게시글이 썩어가고(?) 있었다.
교육 내용이 드러나지 않게 하려다 보니 정기적인 기록이 힘든 듯 🤔
그래도 개인적으로 추가적으로 공부한건 꾸준히 업로드하려고 노력해 봐야겠다!