# 네이버 검색 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)
{
"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":"수빈'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
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)
⇊
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()
⇊