33.EDA-10

SOWA·2023년 4월 10일
0

EDA

목록 보기
10/11
post-custom-banner

🧷 NAVER API

🖇️ 네이버 API 등록및 간단한 사용

# 네이버 검색 API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "RYOUR CLIENT ID"
client_secret = "YOUR CLIENT SECRET"
encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/blog?query=" + encText # JSON 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # XML 결과
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)
  • urllib: http프로토콜에 따라서 서버의 요청/응답을 처리하기 위한 모듈
  • urllib.request:클라이언트 요청을 처리하는 모듈
  • urllib.parse: url 주소에 대한 분석
{
	"lastBuildDate":"Sun, 09 Apr 2023 01:22:33 +0900",
	"total":389772,
	"start":1,
	"display":10,
	"items":[
		{
			"title":"<b>파이썬<\/b>자격증 취득 독학보다 학원이 좋은 이유",
			"link":"https:\/\/blog.naver.com\/hyunju7647\/223021791438",
			"description":"그래서 처음으로 코딩을 배워보기 위해 <b>파이썬<\/b>자격증을 취득하게 되었습니다. <b>파이썬<\/b>자격증을 가장 먼저 취득한 이유는 기초코딩 중에서 가장 배우기 쉽다고 해서 취득하게 되었는데요. 기초코딩에는 C언어와... ",
			"bloggername":"슈퍼더블디",
			"bloggerlink":"blog.naver.com\/hyunju7647",
			"postdate":"20230220"
		},
		{
			"title":"<b>파이썬<\/b>학원 알뜰한 준비과정",
			"link":"https:\/\/blog.naver.com\/djhyul\/223065807088",
			"description":"생겨서 <b>파이썬<\/b>학원으로 갈만한 곳을 알아보기 시작했죠. 그린컴퓨터아카데미는 제가 알아보고 다니기 시작했던 학원인데 이곳에서는 기초가 된다는 <b>파이썬<\/b>이나 영상편집 IT 관련 수업들을 진행하고 있다고... ",
			"bloggername":"서대전점",
			"bloggerlink":"blog.naver.com\/djhyul",
			"postdate":"20230405"
		},
		{
			"title":"<b>파이썬<\/b>학원을 다니면서 공부해야하는 이유",
			"link":"https:\/\/blog.naver.com\/sow723\/223024072662",
			"description":"개발자와는 전혀 관계 없던 제가 <b>파이썬<\/b>학원을 다니면서 이 쪽으로 취업에 성공할 줄이야 아무도... 그래서 일단 비전공자도 쉽게 배울 수 있다는 언어를 배우기 위해서 #<b>파이썬<\/b>학원 을 다녀보게 되었습니다.... ",
			"bloggername":"Onelog",
			"bloggerlink":"blog.naver.com\/sow723",
			"postdate":"20230222"
		},
		{
			"title":"<b>파이썬<\/b>학원 초보자를 위한 공부과정!",
			"link":"https:\/\/blog.naver.com\/chzhvkdll\/222931446581",
			"description":"그래서 제가 <b>파이썬<\/b>학원을 다닌 계기과 장단점, 고민에 대해 써보도록 하겠습니다 :) 모두가 같을 수는... <b>파이썬<\/b>학원 수강 신청한 건 대학 후배 중에 갑자기 전공 무관하게 그쪽으로 턴해서 공부하고 취직했단... ",
			"bloggername":"에피",
			"bloggerlink":"blog.naver.com\/chzhvkdll",
			"postdate":"20221118"
		},
		{
			"title":"<b>파이썬<\/b> 자격증 취득 수업 내용 정리!",
			"link":"https:\/\/blog.naver.com\/eunoia1017\/222968873209",
			"description":"<b>파이썬<\/b> 자격증 취득 수업 내용 정리! 많은 분들이 자신의 본 직업이나 N잡으로 코딩 한 번씩은 다... 오늘은 제가 왜 <b>파이썬<\/b> 자격증을 취득하게 되었는지에 대한 글을 같이 써보려고 해요! <b>파이썬<\/b> 자격증을... ",
			"bloggername":"반짝반짝 빛나는",
			"bloggerlink":"blog.naver.com\/eunoia1017",
			"postdate":"20221229"
		},
		{
			"title":"<b>파이썬<\/b>자격증 학원 다니면서 준비하기!",
			"link":"https:\/\/blog.naver.com\/subin_s_humteresting\/223003132311",
			"description":"<b>파이썬<\/b>자격증에 대한 정보를 잘 알고 있는 게 아니었습니다. 인터넷에 검색해도 뭐가 좋을지 제대로... 그래서 저는 <b>파이썬<\/b>자격증을 취득하기 전에, 해당 프로그래밍 언어에 대한 기본기부터 배우기로... ",
			"bloggername":"수빈&apos;s humteresting",
			"bloggerlink":"blog.naver.com\/subin_s_humteresting",
			"postdate":"20230202"
		},
		{
			"title":"부산코딩학원 <b>파이썬<\/b> 개발 기초부터 배우기",
			"link":"https:\/\/blog.naver.com\/cd34579\/222947814795",
			"description":"좋지만 <b>파이썬<\/b>이 업계에서 많이 쓰고 있기도 하고, 처음 배우기에는 가장 쉬운 언어라고 하셔서 <b>파이썬<\/b> 기초반에 등록을 하게 되었습니다! 지금 생각해보면 <b>파이썬<\/b>으로 시작하기 잘한 것 같아요. 프로그래밍은... ",
			"bloggername":"행복바이러스^^",
			"bloggerlink":"blog.naver.com\/cd34579",
			"postdate":"20221206"
		},
		{
			"title":"<b>파이썬<\/b>학원 실무적인 학습 커리큘럼",
			"link":"https:\/\/blog.naver.com\/euney\/223064924715",
			"description":"전망이 나빠진 본인의 전공을 고려하여 <b>파이썬<\/b>학원을 염두에 두는 인원이 상당히 많아지는 추세인데요.... 소개해드리는 <b>파이썬<\/b> 관련 취직 루트를 유심히 살펴보시길 바랍니다. 초심자의 입장에서 왜 독학이... ",
			"bloggername":"혼자만의 여행",
			"bloggerlink":"blog.naver.com\/euney",
			"postdate":"20230404"
		},
		{
			"title":"<b>파이썬<\/b> 학원 선택 이유 및 수업과정",
			"link":"https:\/\/blog.naver.com\/shek99\/222983518965",
			"description":"그 중에서도 <b>파이썬<\/b> 학원을 선택을 했어요. <b>파이썬<\/b> 학원을 선택한 이유는 많은 코딩 프로그램 중 <b>파이썬<\/b>이 가장 좋아 보였기 때문입니다. 이전에는 JAVA나 자바 스크립트, C언어를 많이 배웠는데 인터넷에서 좀... ",
			"bloggername":"Architect & Humanity 건축 인문",
			"bloggerlink":"blog.naver.com\/shek99",
			"postdate":"20230113"
		},
		{
			"title":"<b>파이썬<\/b> 강의 취업 성공의 필수 학습전략",
			"link":"https:\/\/blog.naver.com\/ansoeon\/222962696977",
			"description":"그렇게 앞으로 뭘 하면서 살까 고민하다가 친구의 권유로 <b>파이썬<\/b> 강의를 듣게 되었습니다. 처음엔 관심... 왜 하필 <b>파이썬<\/b>이냐고 한다면 기존에 쓰던 프로그래밍 언어는 0과1로만 이루어진 이진수였는데요.... ",
			"bloggername":"취미부자 짠테커 집사",
			"bloggerlink":"blog.naver.com\/ansoeon",
			"postdate":"20221222"
		}
	]
}


response

<http.client.HTTPResponse at 0x24008690490>


`
response.getcode()

200

  • 응답결과를 response에 저장
  • http.client.HTTPResponse 클래스틑 getcode()함수를 이용하여 응답상태 확인가능

🖇️ 네이버 API에서 모은 몰스킨 데이터 정리

  • url 생성
def gen_search_url(api_node, search_text, start_num, disp_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 = '&disp=' + str(disp_num)
    
    return base +  node + param_query + param_start + param_disp
gen_search_url('shop', 'TEST', 10, 3)

'https://openapi.naver.com/v1/search/shop.json?queryTEST&start=10&disp=3'


  • 하나의 페이지에서 데이터 얻어오기
import json
import datetime

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'))
url = gen_search_url('shop', '몰스킨', 1, 5)
one_result = get_result_onpage(url)

[2023-04-11 00:27:39.204155] Url Request Success


one_result

{'lastBuildDate': 'Tue, 11 Apr 2023 00:27:39 +0900',
 'total': 33431,
 'start': 1,
 'display': 10,
 'items': [{'title': '<b>몰스킨</b> 노트 가죽 하드커버 감성 고급 업무용 이쁜 심플',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=82526953942',
   'image': 'https://shopping-phinf.pstatic.net/main_8252695/82526953942.7.jpg',
   'lprice': '28800',
   'hprice': '',
   'mallName': '베스트펜',
   'productId': '82526953942',
   'productType': '2',
   'brand': '몰스킨',
   'maker': '',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '노트/수첩',
   'category4': '노트'},
  {'title': '<b>몰스킨</b> 클래식노트 플레인 소프트커버 포켓 Pocket',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=30656121375',
   'image': 'https://shopping-phinf.pstatic.net/main_3065612/30656121375.20220124025746.jpg',
   'lprice': '21840',
   'hprice': '',
   'mallName': '네이버',
   'productId': '30656121375',
   'productType': '1',
   'brand': '몰스킨',
   'maker': '',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '노트/수첩',
   'category4': '노트'},
  {'title': '<b>몰스킨</b> 2023위클리 사파이어블루 하드 L',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=32288589870',
   'image': 'https://shopping-phinf.pstatic.net/main_3228858/32288589870.20230104072413.jpg',
   'lprice': '18500',
   'hprice': '',
   'mallName': '네이버',
   'productId': '32288589870',
   'productType': '1',
   'brand': '몰스킨',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '2023년 <b>몰스킨</b> 하드커버 다이어리(데일리, 위클리, 한정판)',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=84904377827',
   'image': 'https://shopping-phinf.pstatic.net/main_8490437/84904377827.1.jpg',
   'lprice': '20000',
   'hprice': '',
   'mallName': '안네프랑크',
   'productId': '84904377827',
   'productType': '2',
   'brand': '몰스킨',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '빈폴 BEAN POLE <b>몰스킨</b> 프렌치 워크 재킷 291119',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=38120555265',
   'image': 'https://shopping-phinf.pstatic.net/main_3812055/38120555265.20230408131449.jpg',
   'lprice': '188540',
   'hprice': '',
   'mallName': '네이버',
   'productId': '38120555265',
   'productType': '1',
   'brand': '빈폴',
   'maker': '',
   'category1': '패션의류',
   'category2': '남성의류',
   'category3': '재킷',
   'category4': ''},
  {'title': '<b>Moleskine</b> 2023년 데일리 플래너 12M 포켓 하드 커버 3 5 x 5 5 - <b>몰스킨</b>',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=36557437115',
   'image': 'https://shopping-phinf.pstatic.net/main_3655743/36557437115.20221216090445.jpg',
   'lprice': '28040',
   'hprice': '',
   'mallName': '네이버',
   'productId': '36557437115',
   'productType': '1',
   'brand': '몰스킨',
   'maker': '',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '<b>몰스킨</b> 클래식노트 룰드 머틀그린 소프트커버 포켓 Pocket',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=37890675675',
   'image': 'https://shopping-phinf.pstatic.net/main_3789067/37890675675.20230212031911.jpg',
   'lprice': '22180',
   'hprice': '',
   'mallName': '네이버',
   'productId': '37890675675',
   'productType': '1',
   'brand': '',
   'maker': '',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '<b>몰스킨</b> <b>Moleskine</b> 2023년 데일리 플래너 12M 포켓 사파이어 소프트 커버 3 5 x 5 5',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=35369364091',
   'image': 'https://shopping-phinf.pstatic.net/main_3536936/35369364091.20221021173420.jpg',
   'lprice': '29800',
   'hprice': '',
   'mallName': '네이버',
   'productId': '35369364091',
   'productType': '1',
   'brand': '몰스킨',
   'maker': '',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '빈폴 <b>몰스킨</b> 재킷 BC2911A61R',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=35675347578',
   'image': 'https://shopping-phinf.pstatic.net/main_3567534/35675347578.20230401150247.jpg',
   'lprice': '226340',
   'hprice': '',
   'mallName': '네이버',
   'productId': '35675347578',
   'productType': '1',
   'brand': '빈폴',
   'maker': '',
   'category1': '패션의류',
   'category2': '남성의류',
   'category3': '재킷',
   'category4': ''},
  {'title': '2023 스타벅스 다이어리 프리퀀시 그린 플래너',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=85132105601',
   'image': 'https://shopping-phinf.pstatic.net/main_8513210/85132105601.jpg',
   'lprice': '32900',
   'hprice': '',
   'mallName': '한정판매니아',
   'productId': '85132105601',
   'productType': '2',
   'brand': '스타벅스',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'}]}


one_result['items'][0]['title']

'<b>몰스킨</b> 노트 가죽 하드커버 감성 고급 업무용 이쁜 심플'


import pandas as pd

def get_fields(json_data):
    title = [each['title'] for each in json_data['items']]
    link = [each['link'] for each in json_data['items']]
    lprice = [each['lprice'] for each in json_data['items']]
    mall_name = [each['mallName'] for each in json_data['items']]
    
    result_pd = pd.DataFrame({
        'title': title,
        'link': link,
        'lprice':lprice,
        'mall':mall_name,
    }, columns=['title', 'lprice', 'link', 'mall'])
    return result_pd
get_fields(one_result)



  • 제목 안 < b>&< /b> 표시 지우기
def delete_tag(input_str):
    input_str = input_str.replace("<b>", "")
    input_str = input_str.replace("</b>", "")
    return input_str
import pandas as pd

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']]
    lprice = [each['lprice'] for each in json_data['items']]
    mall_name = [each['mallName'] for each in json_data['items']]
    
    result_pd = pd.DataFrame({
        'title': title,
        'link': link,
        'lprice':lprice,
        'mall':mall_name,
    }, columns=['title', 'lprice', 'link', 'mall'])
    return result_pd
get_fields(one_result)




url = gen_search_url('shop', '몰스킨', 1, 5)
json_result = get_result_onpage(url)
pd_result = get_fields(json_result)
pd_result




result_mol = []
for n in range(1, 1001, 10):
    url = gen_search_url('shop', '몰스킨', n, 100)
    json_result = get_result_onpage(url)
    pd_result = get_fields(json_result)
    
    result_mol.append(pd_result)
    
result_mol = pd.concat(result_mol)
result_mol.reset_index(drop=True, inplace=True)
result_mol.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 4 columns):
#   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
0   title   1000 non-null   object
1   lprice  1000 non-null   object
2   link    1000 non-null   object
3   mall    1000 non-null   object
dtypes: object(4)
memory usage: 31.4+ KB


  • 엑셀로 저장
pip install xlsxwriter

ㄴ 엑셀 형태로 저장하기위한 모듈 설치

result_mol['lprice'] = pd.to_numeric(result_mol['lprice'])
writer = pd.ExcelWriter('../data/06_molskin_diary_in_naver_shop.xlsx', engine='xlsxwriter')
result_mol.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', 50)
worksheet.set_column('F:F', 10)

worksheet.conditional_format('C2:C1001', {'type':'3_color_scale'})
writer.save()




🖇️ 몰스킨 데이터 시각화

%%writefile ./set_matplotlib_hangul.py

import platform
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

path = "c:/Windows/Fonts/malgun.ttf"

if platform.system() == "Windows":
    print("Hangul OK in your windows")
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc("font",family=font_name)
else:
    print("buy windows")
plt.rcParams["axes.unicode_minus"]=False

ㄴ 한글 깨지는것을 방지하기위해 모듈 생성


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

plt.figure(figsize=(15, 6))
sns.countplot(
    x='mall',
    data=result_mol,
    palette='RdYlGn',
    order=result_mol['mall'].value_counts().index  #value 갯수 세기
)
plt.xticks(rotation=90)
plt.show()





from.제로베이스 데이터 취업스쿨 강의
post-custom-banner

0개의 댓글