-
[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/
Kakao Developers_
더 나은 세상을 꿈꾸고 그것을 현실로 만드는 이를 위하여 카카오에서 앱 개발 플랫폼 서비스를 시작합니다.
developers.kakao.com
2) NAVER API : https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음성인식, 음성합성 등이 있습니다.
developers.naver.com
이 글에서는 Naver 검색 API를 이용하여 도서 정보를 Crawling하는 과정을 소개할 것이다.
그림1. NAVER Developers 메인 화면 ① 먼저, 네이버 개발자센터(상단 링크 참고 요망)에서 [Application] - [애플리케이션 등록]을 통해 애플리케이션을 등록한다.
그림2. [Application] - [애플리케이션 등록] ② 애플리케이션 이름을 정하고 사용 API 중에서 검색을 선택한다. 이때, 웹 설정의 적당한 도메인이 없다면 http://sample.com으로 작성할 것을 권장한다.
그림3. 애플리케이션 등록(API 신청) ③ 발급한 ClientID와 ClientSecret을 확인한다.(코드 상에서 필요하므로 따로 작성해둘 것을 권장)
그림4. ClientID & ClientSecret 확인 ④ 네이버 개발자 센터의 [Document]=>[검색]을 선택한 후, API 기본 정보를 확인하여 원하는 URL 참조(response값의 형식으로 나뉨(XML/JSON))
그림5. [검색 서비스] - [도서] – [API 기본 정보] 위와 같이 준비가 다 되었다면, Crawling을 실시한다.
* 검색 - 블로그에 네이버 개발자센터의 예제가 있음으로 참고할 것을 권장한다.
* 관련 링크 : https://developers.naver.com/docs/search/blog/
검색 API 블로그 검색 개발가이드
NAVER Developers - 검색 API 블로그 검색 개발가이드
developers.naver.com
크롤링하기 앞서, Web에 대한 이해가 필요하므로 간단하게 설명을 한다면(하단의 그림과 같이 참고할 것)
1) Web은 User(하단의 그림에서는 Google)가 contents를 요청(HTTP request라고 함)하게 되면 parsing 한 후 server로 넘어간다.
2) Server는 요청된 contents(query를 의미)를 HTML, CSS, Javascript 등으로 응답하게 된다.
3) 이후, XML 혹은 JSON 형식으로 로딩한 후 렌더링하게 되는데 렌더링을 해주는 서비스가 Web Browser이다.
그림6. Web에 대한 이해 이러한 이론과 NAVER API를 활용하여 도서 정보를 Crawling하는 소스코드를 만들어보자.
① 먼저, parsing과 Data load를 위해 json과 request 라이브러리를 import한다.
그림 7. import ② 그 후, 네이버 개발자센터에서 받은 Clint 정보를 변수에 저장한다.
그림 8. Clinet id 및 secret 저장 ③ URL 및 query를 입력한 후
그림9. URL 및 query 입력 ④ openAPI에 요청한다.
그림 10. open API 검색 요청 ⑤ request의 결과값(response를 의미)를 저장한 후, error code를 확인한다.(401과 관련된 '권한없음'이 나오면 애플리케이션 등록을 재확인 권장)
그림 11. response값 로드 및 error code 확인 ⑥ 이렇게 search()함수를 다 작성했으면 질의를 요청하여 응답값을 json형태로 로딩한다.
그림 12. query 요청 및 결과를 json형태로 load ⑦ 그 후, 실행시켜 결과를 확인하면 다음과 같다.
그림 13. Crawling 결과 * 소스코드 전체
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()