네이버 API - 검색

이상해씨·2021년 10월 11일
0

EDA, 웹크롤링

목록 보기
13/13

◾import

import urllib
import urllib.request
import json
import datetime
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
import set_matplotlib_korean

1. Naver API 등록

2. Naver API 사용

  • 개발자 가이드를 보며 테스트 : 링크
  • 네이버 검색
    • urllib : http 프로토콜에 따라 서버 요청/응답 처리를 위한 모듈
    • urllib.request : 클라이언트의 요청을 처리하는 모듈
    • urllib.parse : url주소에 대한 분석
  • url : https://openapi.naver.com/v1/search/옵션 으로 연결
    • node : blog, book, movie, cafearticle, shop, encyc 등
    • type : .json, .xml
    • ?query : 검색할 문자(열)
    • &start : 데이터를 추출한 시작 번호
    • &display : 데이터 결과 출력 건수
# 네이버 검색 Open API 예제 - 책 검색
import os
import sys
import urllib
import urllib.request
client_id = "개인id"
client_secret = "개인secret"
# url 처리
encText = urllib.parse.quote("파이썬")

# 책
url = "https://openapi.naver.com/v1/search/book?query=" + encText # json 결과
# url = "https://openapi.naver.com/v1/search/book.xml?query=" + encText # xml 결과

# request 요청 처리
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)

# 응답 결과 respose에 저장
response = urllib.request.urlopen(request)

# getcode() : 상태 코드 확인
# 에러는 에러코드 페이지가 있다.
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)
  • 결과 확인 : 결과 확인을 위해 decode 필수
# response, 상태코드
response, response.getcode(), response.code, response.status
# 글자로 읽을 경우, decode utf-8 설정
response_body.decode('utf-8')[:500]

◾파이썬 책 데이터

  • '파이썬'으로 책 정보를 검색하여 정리
    • title, author, price, link, publisher

1. 데이터 추출

  • URL 생성 함수
def gen_search_url(api_node, search_text, start_num, display_num):
    base = "https://openapi.naver.com/v1/search"
    node = '/' + api_node + ".json"
    param_query = "?query=" + urllib.parse.quote(search_text)
    param_start = "&start=" + str(start_num)
    param_disp = "&display=" + str(display_num)
    
    return base + node + param_query + param_start + param_disp
  • 결과 출력 함수
def get_result_onpage(url):
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request)
    print('[%s] URL Request Success' % datetime.datetime.now())
    return json.loads(response.read().decode("utf-8"))
  • 태그 삭제 함수
def delete_tag(input_str):
    input_str = input_str.replace('<b>', "")
    input_str = input_str.replace('</b>', "")
    return input_str
  • 속성 추출 함수
def get_fields(json_data):
    title = [delete_tag(each['title']) for each in json_data['items']]
    link = [each['link'] for each in json_data['items']]
    author = [each['author'] for each in json_data['items']]
    price = [each['price'] for each in json_data['items']]
    publisher = [each['publisher'] for each in json_data['items']]

    result_pd = pd.DataFrame({
        "title" : title,
        "author" : author,
        "price" : price,
        'link'  : link,
        "publisher" : publisher
    }, columns=["title", 'author', 'price', 'link', 'publisher'])

    return result_pd

2. 데이터 정리

  • 반복을 통해 데이터 추출
result_book = []

for n in range(1, 500, 50):
    url = gen_search_url("book", '파이썬', n, 50)
    json_result = get_result_onpage(url)
    pd_result = get_fields(json_result)

    result_book.append(pd_result)

result_book = pd.concat(result_book)
  • 데이터프레임 확인
result_book.head()

  • 데이터프레임 정보 확인 : 인덱스와 price 타입 문제 확인
result_book.info()

  • 데이터 정리
    • reset index
    • price 데이터 타입 변경
result_book.reset_index(drop=True, inplace=True)
result_book['price'] = result_book['price'].astype('float')
result_book.info()

  • 엑셀 작업
    • ExcelWriter : 엑셀 작업을 파이썬 코드로 작성
      • engine='xlsxwriter' : pip install xlsxwriter
    • set_column : 컬럼 간격(크기) 조절
    • conditional_format : 조건에 따라 스타일 적용
    • save : 저장
# 저장
writer = pd.ExcelWriter("../data/06/06. python_in_naver_book.xlsx", engine='xlsxwriter')
result_book.to_excel(writer, sheet_name="Sheet1")

workbook = writer.book  
worksheet = writer.sheets["Sheet1"]
# 각 셀의 간격(크기) 조절
worksheet.set_column("A:A", 4)  # A컬럼  4칸으로 간격(크기) 조정
worksheet.set_column("B:B", 60) # B컬럼 60칸으로 간격(크기) 조정
worksheet.set_column("C:C", 10) # C컬럼 10칸으로 간격(크기) 조정
worksheet.set_column("D:D", 10) # D컬럼 10칸으로 간격(크기) 조정
worksheet.set_column("E:E", 10) # E컬럼 50칸으로 간격(크기) 조정
worksheet.set_column("F:F", 20) # F컬럼 10칸으로 간격(크기) 조정
worksheet.set_column("G:G", 10) # F컬럼 10칸으로 간격(크기) 조정

worksheet.conditional_format("D2:D501D", {"type" : "3_color_scale"})
writer.save()

3. 데이터 시각화

  • 각 출판사별 출판현황 그래프
    • countplot : 각 카테고리별 데이터 개수 표시
plt.figure(figsize=(25, 6))
sns.countplot(
    x=result_book["publisher"],
    data=result_book,
    palette='RdYlGn',
    order=result_book["publisher"].value_counts().index
)
plt.xticks(rotation=90)
plt.show()

  • 책의 가격 분포도
plt.figure(figsize=(8, 6))
# color : 0 ~ 1(검정색 ~ 흰색)
sns.swarmplot(y ="price", data=result_book)
plt.show()

profile
후라이드 치킨

0개의 댓글