◾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
◾Naver API
1. Naver API 등록
- 네이버 API : 네이버 개발자 센터
- Open API 신청
- 발급된 개인 ID, Secret으로 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 : 데이터 결과 출력 건수
import os
import sys
import urllib
import urllib.request
client_id = "개인id"
client_secret = "개인secret"
encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/book?query=" + encText
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)
rescode = response.getcode()
if(rescode==200):
response_body = response.read()
print(response_body.decode('utf-8'))
else:
print("Error Code:" + rescode)
- 결과 확인 : 결과 확인을 위해 decode 필수
response, response.getcode(), response.code, response.status
response_body.decode('utf-8')[:500]
◾파이썬 책 데이터
- '파이썬'으로 책 정보를 검색하여 정리
- title, author, price, link, publisher
1. 데이터 추출
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)
worksheet.set_column("B:B", 60)
worksheet.set_column("C:C", 10)
worksheet.set_column("D:D", 10)
worksheet.set_column("E:E", 10)
worksheet.set_column("F:F", 20)
worksheet.set_column("G:G", 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))
sns.swarmplot(y ="price", data=result_book)
plt.show()
