Open API를 활용한 크롤링

이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 강의 사이트와 유투브 채널을 오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
●  잔재미코딩 유투브 오픈 [구독해보기]

3. Open API(Rest API)를 활용한 크롤링

3.1. Open API(Rest API)란?

  • API: Application Programming Interface의 약자로, 특정 프로그램을 만들기 위해 제공되는 모듈(함수 등)을 의미
  • Open API: 공개 API라고도 불리우며, 누구나 사용할 수 있도록 공개된 API (주로 Rest API 기술을 많이 사용함)
  • Rest API: Representational State Transfer API의 약자로, HTTP프로토콜을 통해 서버 제공 기능을 사용할 수 있는 함수를 의미
    • 일반적으로 XML, JSON의 형태로 응답을 전달(원하는 데이터 추출이 수월)

3.2. JSON 이란?

  • JavaScript Object Notation 줄임말
  • JSON은 서버와 클라이언트 또는 컴퓨터/프로그램 사이에 데이터를 주고 받을 때 사용하는 데이터 포멧
  • 키와 값을 괄호와 세미콜론과 같이 간단한 기호로 구성하여 표현할 수 있고, 언어나 운영체제에 구애받지 않기 때문에 많이 사용됨
  • 특히 웹/앱 환경에서 Rest API를 사용하여, 서버와 클라이언트 사이에 데이터를 주고 받을때 많이 사용
  • JSON 포멧 예

{ "id":"01", "language": "Java", "edition": "third", "author": "Herbert Schildt" }

3.3. 네이버 검색 Open API를 이용한 크롤링 초간단 실습

  • 네이버와 같은 주요 포털 사이트에서도 Open API를 제공함 (네이버 Developers 사이트 링크: https://developers.naver.com/main/)
  • 네이버 Developers 사이트 가입 후,
  • Application -> 애플리케이션 등록(API 이용신청) 에서 다음과 같이 입력하여, 검색 API 사용 신청
No description has been provided for this image
  • Application -> 내 애플리케이션에서 Client ID 와 Client Secret 확인
No description has been provided for this image
  • postman 설치

    1. Chrome 브라우저에서 다음 링크를 통해 Postman 설치 및 실행 Postman 링크
    2. Postman 에 회원가입 및 로그인
    3. 다음 Rest API 주소 넣기
    https://openapi.naver.com/v1/search/news.json?query=스마트
    
    1. 헤더에 X-Naver-Client-Id(key), 내 애플리케이션의 Client ID(value) 추가 하기
    2. 헤더에 X-Naver-Client-Secret(key), 내 애플리케이션의 Client Secret(value) 추가 하기
    3. Send
    No description has been provided for this image

3.4. urllib 라이브러리를 활용한 크롤링 코드

  • 인터넷에 다양한 예제들이 urllib 또는 urllib2를 사용한 예제들이 많으므로, 익혀둘 필요가 있음
In [79]:
import urllib.request
import json

client_key = 'CsODwdUTyG9vOI1uIeIf'
client_secret = 'YmIx0GW8JG'

# 한글등 non-ASCII text를 URL에 넣을 수 있도록 "%" followed by hexadecimal digits 로 변경
# URL은 ASCII 인코딩셋만 지원하기 때문임
encText = urllib.parse.quote_plus("스마트폰")
# print(encText)

naver_url = 'https://openapi.naver.com/v1/search/news.json?query=' + encText

# urllib.request.Request()는 HTTP Header 변경시에 사용함
# 네이버에서도 다음 HTTP Header 키를 변경해야하기 때문에 사용함
# HTTP Header 변경이 필요없다면, 바로 urllib.request.urlopen()함수만 사용해도 됩
request = urllib.request.Request(naver_url)
request.add_header("X-Naver-Client-Id",client_key)
request.add_header("X-Naver-Client-Secret",client_secret)

# urllib.request.urlopen 메세드로 크롤링할 웹페이지를 가져옴
response = urllib.request.urlopen(request)


# getcode() 메서드로 HTTP 응답 상태 코드를 가져올 수 있음
rescode = response.getcode()

# HTTP 요청 응답이 정상적일 경우, 해당 HTML 데이터를 수신되었기 때문에 필요한 데이터 추출이 가능함
# HTTP 요청에 대한 정상응답일 경우, HTTP 응답 상태 코드 값이 200이 됩니다.
if(rescode == 200):
    # response.read() 메서드로 수신된 HTML 데이터를 가져올 수 있음
    response_body = response.read()
    # 네이버 Open API를 통해서 수신된 데이터가 JSON 포멧이기 때문에, 
    # JSON 포멧 데이터를 파싱해서 사전데이터로 만들어주는 json 라이브러라를 사용
    data = json.loads(response_body)
    # json.loads() 메서드를 사용해서 data 에 수신된 데이터를 사전 데이터로 분석해서 자동으로 만들어줌
    print (data['items'][0]['title'])
    print (data['items'][0]['description'])
else:
    print("Error Code:" + rescode)
갤럭시노트8을 사고나서 제일 먼저 할일은?
지문인식센서 제스쳐 기능이란 <b>스마트폰</b> 화면이 켜진 상태에서 지문인식센서에 손가락을 갖다대면 화면을 끈다거나 상단의 알림트레이를 손가락으로 스와이프 하는 동작을 대신할 수 있다. 특히 갤럭시노트8은 화면이... 
본 자료 보다 업데이트된 자료와 함께 온라인 강의로 익히면 체계적으로 이해할 수 있습니다!
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요

3.5. requests 라이브러리를 활용한 크롤링 코드 (간결함, 권장)

  • requests 라이브러리를 사용해서 Open API(Rest API) 를 통해 데이터를 바로 가져올 수 있음
In [78]:
import requests

client_key = 'CsODwdUTyG9vOI1uIeIf'
client_secret = 'YmIx0GW8JG'
# 별도 quote_plus() 메서드등 처리할 필요 없음. requests 객체가 알아서 해줌
naver_url = 'https://openapi.naver.com/v1/search/news.json?query=스마트폰'

header_params = {"X-Naver-Client-Id":client_key, "X-Naver-Client-Secret":client_secret}
# headers= header_params 는 header 변경시에만 필요하고, 그렇지 않으면, requests.get(원하는 URL) 만 해도 됨
response = requests.get(naver_url, headers = header_params)
# 별도 json.loads() 라이브러리 메서드 사용하지 않아도, reqeusts 라이브러리에 있는 json() 메서드로 간단히 처리 가능함
# print(response.json())
# print(response.text)

# HTTP 응답 코드는 status_code 에 저장됨
if(response.status_code == 200):
    data = response.json()
    print(data['items'][0]['title'])
    print(data['items'][0]['description'])
else:
    print("Error Code:" + response.status_code)
아이폰X는 전세계에 얼마나 팔릴까?
출처=애플 애플이 하반기 프리미엄 <b>스마트폰</b> 아이폰X를 공개한 가운데, 판매 성적에도 비상한 관심이 쏠리고 있다. 일각에서는 연내 최대 5000만대가 팔려 4분기 기준으로 세계 <b>스마트폰</b> 판매량 1위에 오를 것이라는... 
연습문제
1. 네이버 개발자 사이트 가입하고, X-Naver-Client-Id, X-Naver-Client-Secret 키 값을 할당받습니다.
2. 위 두 가지 키로 네이버 검색 Open API를 사용해서 부동산 키워드로 검색 결과 중 상위 10개의 타이틀을 출력합니다.
(참고코드는 3.2.1.1 절, 3.2.1.2 절을 보시면 되고, 해당 코드에서 일부만 수정하시면 됩니다.)