EDA_6 NAVER API

이병찬·2024년 3월 13일

EDA

목록 보기
6/7
post-thumbnail

네이버 API 사용 등록

네이버 검색 API 사용하기

블로그 검색

import os
import sys
import urllib.request

client_id = "PZrVD40NyyLDiMYRkpA5"
client_secret = "seDyKO_3af"

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":"Wed, 13 Mar 2024 14:40:08 +0900",
	"total":457061,
	"start":1,
	"display":10,
	"items":[
		{
			"title":"<b>파이썬<\/b>자격증 종류 및 체계적인 학습절차",
			"link":"https:\/\/blog.naver.com\/iclick62\/223376341162",
			"description":"#<b>파이썬<\/b>자격증 취업을 하기 위해서는 다양한 능력을 가지고 있어야 했습니다. 이론적인 지식은... 마지막으로 <b>파이썬<\/b>자격증에 도전하여 취득한 후 입사지원을 해 볼 생각이었습니다. 단기간에 취득할 수 있어야... ",
			"bloggername":"연리지(連理枝)",
			"bloggerlink":"blog.naver.com\/iclick62",
			"postdate":"20240307"
		},
		{
			"title":"<b>파이썬<\/b> 자격증 취득을 희망한다면",
			"link":"https:\/\/blog.naver.com\/sow723\/223373911489",
			"description":"빅데이터를 전문적으로 학습하기 전에 기초적인 <b>파이썬<\/b>을 배워야 했고 수강할만한 곳을 찾고 있었어요! <b>파이썬<\/b>이란 데이터 처리를 위한 프로그래밍 언어이기 때문에 기초적인 부분부터 실무에 도움이 될만한... ",
			"bloggername":"Onelog",
			"bloggerlink":"blog.naver.com\/sow723",
			"postdate":"20240305"
		},
		{
			"title":"<b>파이썬<\/b>자격증 종류 취득과정 및 수업방법",
			"link":"https:\/\/blog.naver.com\/ppong_2\/223348347109",
			"description":"빅데이터를 배우기 위해선 가장 기초적인 <b>파이썬<\/b>을 배워야 했습니다. 그래서 가장 먼저 <b>파이썬<\/b>자격증을 취득하게 되었어요. 개발자 수업을 듣기 위해 학원을 알아보았습니다. 생각보다 많은 곳이 있어서 가장... ",
			"bloggername":"diary",
			"bloggerlink":"blog.naver.com\/ppong_2",
			"postdate":"20240208"
		},
		{
			"title":"강남프로그래밍학원 체계적인 <b>파이썬<\/b> 수업 과정",
			"link":"https:\/\/blog.naver.com\/aengpark\/223353556159",
			"description":"그 중에서 AI 개발자가 필수적으로 배워둬야 한다는 <b>파이썬<\/b> 과목을 등록하기 위해 방문을 했어요.... 첫 수업에서는 <b>파이썬<\/b>에 대해 먼저 간략하게 소개를 해 주셨어요. 이건 문법이 다른 언어에 비해서 비교적... ",
			"bloggername":"aeng’s",
			"bloggerlink":"blog.naver.com\/aengpark",
			"postdate":"20240214"
		},
		{
			"title":"강남코딩학원 <b>파이썬<\/b> 기초부터 배운 수업과정",
			"link":"https:\/\/blog.naver.com\/dmsdud0395\/223381229364",
			"description":"처음에는 <b>파이썬<\/b> 준비, 연산자, 함수와 같은 이론을 배울 때라 화면을 보고 배우고, 따라하는 방식으로... 태어나 처음으로 <b>파이썬<\/b>을 접했기 때문에 이렇게 아주 기본적인 것부터 디테일하게 알려주는 수업... ",
			"bloggername":"그럼에도 불구하고..",
			"bloggerlink":"blog.naver.com\/dmsdud0395",
			"postdate":"20240313"
		},
		{
			"title":"코딩이 대세니까 엄마도 배운다 Do it! 첫 코딩 with <b>파이썬<\/b>",
			"link":"https:\/\/blog.naver.com\/sweetten\/223368318203",
			"description":"첫 코딩 with <b>파이썬<\/b> Do it! 첫 코딩 with <b>파이썬<\/b> 저자 정동균 출판 이지스퍼블리싱 발매 2021.01.15. 제가 코딩을 처음 학습하기 앞서 이 책을 고른 이유 바로 책 겉표지에 쓰여있는 세가지 장점이예요. 비유와... ",
			"bloggername":"즐거운 봄하늘의 19호실",
			"bloggerlink":"blog.naver.com\/sweetten",
			"postdate":"20240228"
		},
		{
			"title":"코딩 없이 챗GPT 대화만으로 <b>파이썬<\/b> 게임 개발하기 (f. 온라인... ",
			"link":"https:\/\/blog.naver.com\/gptfrontier\/223335002844",
			"description":"대화하며 <b>파이썬<\/b>으로 만든 벽돌깨기 게임입니다. 거의 오류 없이 코드를 만들어줘서 만드는데 한시간이 채 안 걸린 것 같습니다. 같이 한 번 보시죠~ 오늘은 자바 코딩엔 익숙하지만 <b>파이썬<\/b>은 잘 모르는... ",
			"bloggername":"구름나무의 GPTier",
			"bloggerlink":"blog.naver.com\/gptfrontier",
			"postdate":"20240126"
		},
		{
			"title":"(23.12.)2023년 KAIST 카이스트 사이버영재교육 <b>파이썬<\/b> 레벨... ",
			"link":"https:\/\/blog.naver.com\/lwooh35\/223378758876",
			"description":"작년에 SW코딩 한창 빠져있던 아들래미가 블록코딩 왠만한거 다 해보고 텍스트 코딩 해보고 싶다해서 먼저 <b>파이썬<\/b> 수업으로 사이버영재교육 2학기 수강을 했었어요. 보통 <b>파이썬<\/b>하고 C언어, 자바 순으로... ",
			"bloggername":"초등 남아 형제와 휴양림 여행 즐기기",
			"bloggerlink":"blog.naver.com\/lwooh35",
			"postdate":"20240310"
		},
		{
			"title":"초등고학년 수준에 맞춘 와이즈코딩 <b>파이썬<\/b>과정",
			"link":"https:\/\/blog.naver.com\/nadash7\/223365755005",
			"description":"와이즈코딩 <b>파이썬<\/b>과정은 시작합니다. 텍스트 코딩은 코드의 의미를 알아야 하며, 어느 부분에서 어떤... 그래서 와이즈코딩은 <b>파이썬<\/b>을 선택했습니다. <b>파이썬<\/b>은 입문용으로 적합한 텍스트 코딩-기초... ",
			"bloggername":"와이즈코딩러닝센터",
			"bloggerlink":"blog.naver.com\/nadash7",
			"postdate":"20240226"
		},
		{
			"title":"의정부코딩학원 자바 vs <b>파이썬<\/b> 어느 걸 배워야 할까?",
			"link":"https:\/\/blog.naver.com\/xorbs6169\/223264584778",
			"description":"자바 ( JAVA ) 와 <b>파이썬<\/b> ( PYTHON ) 에 대해서 알아보고 비교해보는 포스팅해볼게요 ! ✅ 언어의 종류 ✅ 자바 ( JAVA ) ✔️ 객체 지향 언어에요 ! ✔️ JVM에서 실행돼요 ! <b>파이썬<\/b> ( Python ) ✔️ 인터프리터... ",
			"bloggername":"그건내과자야",
			"bloggerlink":"blog.naver.com\/xorbs6169",
			"postdate":"20231114"
		}
	]
}

상품 검색, url의 blog->shop으로 변경

import os
import sys
import urllib.request

client_id = "PZrVD40NyyLDiMYRkpA5"
client_secret = "seDyKO_3af"

encText = urllib.parse.quote("몰스킨")
url = "https://openapi.naver.com/v1/search/shop?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":"Thu, 04 Jan 2024 08:54:02 +0900",
	"total":53806,
	"start":1,
	"display":10,
	"items":[
		{
			"title":"스타벅스 2024년 <b>몰스킨<\/b> 다이어리 데일리 플래너 일기장 노트 스벅 카페 윈터 e프리퀀시",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=86963344737",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_8696334\/86963344737.41.jpg",
			"lprice":"34000",
			"hprice":"",
			"mallName":"유니스스토어",
			"productId":"86963344737",
			"productType":"2",
			"brand":"스타벅스",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"<b>몰스킨<\/b> 2024 다이어리 클래식 소프트커버 데일리 포켓 2024년 24년",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=86678199160",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_8667819\/86678199160.3.jpg",
			"lprice":"25200",
			"hprice":"",
			"mallName":"베스트펜",
			"productId":"86678199160",
			"productType":"2",
			"brand":"몰스킨",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"<b>몰스킨<\/b> 2024 다이어리 클래식 하드커버 위클리 포켓 2024년 24년",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=86678091959",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_8667809\/86678091959.1.jpg",
			"lprice":"22680",
			"hprice":"",
			"mallName":"베스트펜",
			"productId":"86678091959",
			"productType":"2",
			"brand":"몰스킨",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"[<b>몰스킨<\/b>] 2024년 클래식 다이어리 (12개월) (데일리, 위클리, 먼슬리)",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=42344941884",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_4234494\/42344941884.jpg",
			"lprice":"22680",
			"hprice":"",
			"mallName":"몰스킨공식온라인스토어",
			"productId":"42344941884",
			"productType":"2",
			"brand":"몰스킨",
			"maker":"",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"<b>몰스킨<\/b> 2024 데일리 다이어리-하드 머틀그린 라지 각인 케이스포장 병행수입 아님",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=43052849828",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_4305284\/43052849828.20231006183518.jpg",
			"lprice":"32760",
			"hprice":"",
			"mallName":"네이버",
			"productId":"43052849828",
			"productType":"1",
			"brand":"몰스킨",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"<b>몰스킨<\/b> 2024 위클리 다이어리 포켓 상품선택",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=44547674101",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_4454767\/44547674101.20231210142944.jpg",
			"lprice":"32300",
			"hprice":"",
			"mallName":"네이버",
			"productId":"44547674101",
			"productType":"1",
			"brand":"몰스킨",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"<b>몰스킨<\/b> 2024 데일리 다이어리 포켓 상품선택",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=42473541158",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_4247354\/42473541158.20230907073601.jpg",
			"lprice":"36000",
			"hprice":"",
			"mallName":"네이버",
			"productId":"42473541158",
			"productType":"1",
			"brand":"몰스킨",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"2024 스타벅스 다이어리 프리퀀시 플래너 <b>몰스킨<\/b> 노트",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=86999511116",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_8699951\/86999511116.5.jpg",
			"lprice":"27400",
			"hprice":"",
			"mallName":"파이영",
			"productId":"86999511116",
			"productType":"2",
			"brand":"",
			"maker":"",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"스타벅스 2024년 다이어리 언데이티드 위클리 플래너 블랙 <b>몰스킨<\/b> 노트 스벅 카페 프리퀀시",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=86969511712",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_8696951\/86969511712.19.jpg",
			"lprice":"34000",
			"hprice":"",
			"mallName":"유니스스토어",
			"productId":"86969511712",
			"productType":"2",
			"brand":"스타벅스",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		},
		{
			"title":"2024 스타벅스 다이어리 카멜 플래너 프리퀀시",
			"link":"https:\/\/search.shopping.naver.com\/gate.nhn?id=87038988515",
			"image":"https:\/\/shopping-phinf.pstatic.net\/main_8703898\/87038988515.jpg",
			"lprice":"30900",
			"hprice":"",
			"mallName":"한정판매니아",
			"productId":"87038988515",
			"productType":"2",
			"brand":"스타벅스",
			"maker":"몰스킨",
			"category1":"생활\/건강",
			"category2":"문구\/사무용품",
			"category3":"다이어리\/플래너",
			"category4":"다이어리"
		}
	]
}

gen_search_url(), 네이버API의 url과 같은구조


# encText = urllib.parse.quote("몰스킨")
# url = "https://openapi.naver.com/v1/search/shop?query=" + encText # json 결과

def gen_search_url(api_node, search_text, start_num, disp_num):
    # 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 = "&display=" + str(disp_num)
    
    return base + node + param_query + param_start + param_disp
    
gen_search_url("shop", "TEST", 10, 3)

get_result_onepage(), 네이버API의 url과 같은구조

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()) # %는 문자열 formated
    return json.loads(response.read().decode("utf-8"))
    
datetime.datetime.now()

url = gen_search_url("shop", "몰스킨", 1, 5)
one_result = get_result_onpage(url)

one_result 확인

{'lastBuildDate': 'Thu, 04 Jan 2024 08:58:56 +0900',
 'total': 53794,
 'start': 1,
 'display': 5,
 'items': [{'title': '스타벅스 2024년 <b>몰스킨</b> 다이어리 데일리 플래너 일기장 노트 스벅 카페 윈터 e프리퀀시',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=86963344737',
   'image': 'https://shopping-phinf.pstatic.net/main_8696334/86963344737.41.jpg',
   'lprice': '34000',
   'hprice': '',
   'mallName': '유니스스토어',
   'productId': '86963344737',
   'productType': '2',
   'brand': '스타벅스',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '<b>몰스킨</b> 2024 다이어리 클래식 소프트커버 데일리 포켓 2024년 24년',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=86678199160',
   'image': 'https://shopping-phinf.pstatic.net/main_8667819/86678199160.3.jpg',
   'lprice': '25200',
   'hprice': '',
   'mallName': '베스트펜',
   'productId': '86678199160',
   'productType': '2',
   'brand': '몰스킨',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '<b>몰스킨</b> 2024 다이어리 클래식 하드커버 위클리 포켓 2024년 24년',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=86678091959',
   'image': 'https://shopping-phinf.pstatic.net/main_8667809/86678091959.1.jpg',
   'lprice': '22680',
   'hprice': '',
   'mallName': '베스트펜',
   'productId': '86678091959',
   'productType': '2',
   'brand': '몰스킨',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '[<b>몰스킨</b>] 2024년 클래식 다이어리 (12개월) (데일리, 위클리, 먼슬리)',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=42344941884',
   'image': 'https://shopping-phinf.pstatic.net/main_4234494/42344941884.jpg',
   'lprice': '22680',
   'hprice': '',
   'mallName': '몰스킨공식온라인스토어',
   'productId': '42344941884',
   'productType': '2',
   'brand': '몰스킨',
   'maker': '',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'},
  {'title': '<b>몰스킨</b> 2024 데일리 다이어리-하드 머틀그린 라지 각인 케이스포장 병행수입 아님',
   'link': 'https://search.shopping.naver.com/gate.nhn?id=43052849828',
   'image': 'https://shopping-phinf.pstatic.net/main_4305284/43052849828.20231006183518.jpg',
   'lprice': '32760',
   'hprice': '',
   'mallName': '네이버',
   'productId': '43052849828',
   'productType': '1',
   'brand': '몰스킨',
   'maker': '몰스킨',
   'category1': '생활/건강',
   'category2': '문구/사무용품',
   'category3': '다이어리/플래너',
   'category4': '다이어리'}]}

각각의 요소 확인

get_fields(), 데이터프레임 및 delete_tag()


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 

actMain()

  • 네이버 api는 한 번에 최대 100개씩 검색 결과를 호출
  • for문을 돌려 총 1000개의 검색 데이터 출력
  • pd_result를 변수로 한 크롤링 결과를 result_mol에 담아준 후 concat을 통해 합친다
result_mol = [] 

for n in range(1, 1000, 100):
    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.info() 

인덱스 재정열 및 lprice float 타입 변경

result_mol.reset_index(drop=True, inplace=True) 
#'인덱스 재정열(reset)'로 0 to 999 인덱스 생성 후 'drop = True'를 통해 추가 인덱스 생성 X
result_mol.info()

result_mol["lprice"] = result_mol["lprice"].astype("float")
result_mol.info()

시각화

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

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

if platform.system() == "Darwin":
    print("Hangul OK in your MAC!!!")
    rc("font", family="Arial Unicode MS")
elif platform.system() == "Windows":
    font_name = font_manager.FontProperties(fname=path).get_name()
    print("Hangul OK in your Windows!!!")
    rc("font", family=font_name)
else:
    print("Unknown system.. sorry~~~")
    
plt.rcParams["axes.unicode_minus"] = False 

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 6))
sns.countplot(
    x = result_mol["mall"], # x축
    data=result_mol, #사용할 데이터
    palette="RdYlGn", # 그래프 형태
    order=result_mol["mall"].value_counts().index
    # value_counts() 메서드 : 고유값의 개수를 카운팅, 칼럼에 따른 빈도수를 계산
)
plt.xticks(rotation=90)
# xticks : 그래프의 x축 값 설정
# yticks : 그래프의 y축 값 설정
# rotation = ? : 반시계방향으로 (x or y)축 레이블(명칭)을 ?도 회전

plt.show()

profile
비전공 데이터 분석가 도전

0개의 댓글