-
[Python] NAVER openAPI를 활용한 Crawling(도서 검색)기타 2019. 9. 25. 15:54
목표 : openAPI를 활용하여 Crawling을 해보자
* openAPI : 표준 웹 프로토콜을 이용하여 프로그램 개발에 사용할 수 있는 공개 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)
- 대표적인 Crawling openAPI
1) DAUM API : https://developers.kakao.com/
2) NAVER API : https://developers.naver.com/main/
이 글에서는 Naver 검색 API를 이용하여 도서 정보를 Crawling하는 과정을 소개할 것이다.
① 먼저, 네이버 개발자센터(상단 링크 참고 요망)에서 [Application] - [애플리케이션 등록]을 통해 애플리케이션을 등록한다.
② 애플리케이션 이름을 정하고 사용 API 중에서 검색을 선택한다. 이때, 웹 설정의 적당한 도메인이 없다면 http://sample.com으로 작성할 것을 권장한다.
③ 발급한 ClientID와 ClientSecret을 확인한다.(코드 상에서 필요하므로 따로 작성해둘 것을 권장)
④ 네이버 개발자 센터의 [Document]=>[검색]을 선택한 후, API 기본 정보를 확인하여 원하는 URL 참조(response값의 형식으로 나뉨(XML/JSON))
위와 같이 준비가 다 되었다면, Crawling을 실시한다.
* 검색 - 블로그에 네이버 개발자센터의 예제가 있음으로 참고할 것을 권장한다.
* 관련 링크 : https://developers.naver.com/docs/search/blog/
크롤링하기 앞서, Web에 대한 이해가 필요하므로 간단하게 설명을 한다면(하단의 그림과 같이 참고할 것)
1) Web은 User(하단의 그림에서는 Google)가 contents를 요청(HTTP request라고 함)하게 되면 parsing 한 후 server로 넘어간다.
2) Server는 요청된 contents(query를 의미)를 HTML, CSS, Javascript 등으로 응답하게 된다.
3) 이후, XML 혹은 JSON 형식으로 로딩한 후 렌더링하게 되는데 렌더링을 해주는 서비스가 Web Browser이다.
이러한 이론과 NAVER API를 활용하여 도서 정보를 Crawling하는 소스코드를 만들어보자.
① 먼저, parsing과 Data load를 위해 json과 request 라이브러리를 import한다.
② 그 후, 네이버 개발자센터에서 받은 Clint 정보를 변수에 저장한다.
③ URL 및 query를 입력한 후
④ openAPI에 요청한다.
⑤ request의 결과값(response를 의미)를 저장한 후, error code를 확인한다.(401과 관련된 '권한없음'이 나오면 애플리케이션 등록을 재확인 권장)
⑥ 이렇게 search()함수를 다 작성했으면 질의를 요청하여 응답값을 json형태로 로딩한다.
⑦ 그 후, 실행시켜 결과를 확인하면 다음과 같다.
* 소스코드 전체
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import urllib.requestimport jsondef search(title):#애플리케이션 클라이언트 id 및 secretclient_id = "애플리케이션 클라이언트 아이디"client_secret = "애플리케이션 클라이언트 시크릿"#도검색 urlurl_query = url + query#Open API 검색 요청 개체 설정request = urllib.request.Request(url_query)request.add_header("X-Naver-Client-Id",client_id)request.add_header("X-Naver-Client-Secret",client_secret)#검색 요청 및 처리response = urllib.request.urlopen(request)rescode = response.getcode()if(rescode == 200):else:return None#프로그램 진입점def main():#검색 질의 요청res = search(input("질의:"))if(res == None):print("검색 실패!!!")exit()#검색 결과를 json개체로 로딩json_response = json.loads(res)if(json_response == None):print("json.loads 실패!!!")exit()#검색 결과의 items 목록의 각 항목(post)을 출력for item in json_response['items']:print("제목:"+item['title'])print("설명:"+item['description'])print("가격:"+item['price'],end="")print('('+item['discount']+')')print("url:"+item['link'])print("================\n")#진입점 함수를 main으로 지정if __name__ == '__main__':main()