스터디 노트(EDA 5)

zoe·2023년 4월 5일
0

네이버 API 사용 등록


네이버 검색 API 사용하기


# 네이버 검색 API 예제 - 블로그 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
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)
response, response.getcode(), response.code, response.status
# 글자로 읽을 경우, decode utf-8 설정
response_body.decode("utf-8")

# 네이버 검색 API 예제 - 책 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
client_secret = # 입력 필요

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/book?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)

# 네이버 검색 API 예제 - 영화 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
client_secret = # 입력 필요

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/movie?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)

# 네이버 검색 API 예제 - 카페 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
client_secret = # 입력 필요

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/cafearticle?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)

# 네이버 검색 API 예제 - 쇼핑 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
client_secret = # 입력 필요

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)

# 네이버 검색 API 예제 - 백과사전 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
client_secret = # 입력 필요

encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/encyc?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)



상품 검색

  • 몰스킨
# 네이버 검색 API 예제 - 쇼핑 검색
import os
import sys
import urllib.request

client_id = # 입력 필요
client_secret = # 입력 필요


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)



  • (1) gen_search_url() : 요청 url 생성
## (1) gen_search_url()
# 요청할 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):
    base = "https://openapi.naver.com/v1/search"
    node = "/" + api_node + ".json"
    param_query = "?query=" + urllib.parse.quote(search_text) # urllib.parse.quote() : 아스키코드 형식이 아닌 글자를 URL 인코딩 시킴
    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")



  • (2) get_result_onepage() : 결과 페이지 얻기
## (2) get_result_onepage()

import json
import datetime

client_id = # 입력 필요
client_secret = # 입력 필요

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"))
datetime.datetime.now()
url = gen_search_url("shop", "몰스킨", 1, 5)
one_result = get_result_onpage(url)
one_result
one_result["items"][0]["title"]
one_result["items"][0]["link"]
one_result["items"][0]["lprice"]
one_result["items"][0]["mallName"]



  • (3) get_fields() : 필요 데이터 얻기
## (3) get_fields()

one_result["items"][0]["title"]
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)



  • (4) delete_tag() : 제목에 불필요하게 포함된 태그 삭제
## (4) delete_tag()

def delete_tag(input_str):
    input_str = input_str.replace("<b>", "")
    input_str = input_str.replace("</b>", "")
    return input_str
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



  • (5) actMain() : 원하는 양의 데이터 가져오기
## (5) actMain()

for n in range(1, 1000, 100):
    print(n)
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()
result_mol.reset_index(drop=True, inplace = True)
result_mol.info()
result_mol["lprice"] = result_mol["lprice"].astype("float")
result_mol.head()
result_mol.tail()



  • (6) to_excel() : 엑셀 내보내기
pip install xlsxwriter
## (6) to_excel()
# 파이썬에서 엑셀 작업하는 것 ★


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()



  • (7) 시각화
pip install matplotlib
## (7) 시각화

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

get_ipython().run_line_magic("matplotlib", "inline")
# %matplotlib inline

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

if platform.system() == "Darwin": # mac일 경우 한글 설정
    rc("font", family="Arial Unicode MS")
elif platform.system() == "Windows": #window일 경우 한글 설정
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc("font", family = font_name)
else:
    print("Unknown system. sorry")
plt.figure(figsize=(15, 6))
sns.countplot(
    x = result_mol["mall"], 
    data=result_mol, 
    palette="RdYlGn",
    order=result_mol["mall"].value_counts().index
)
plt.xticks(rotation=90)
plt.show()

파이썬에서 엑셀 작업하는 코드 나중에 더 알아봐야 할 것같다...

💻 출처 : 제로베이스 데이터 취업 스쿨

profile
#데이터분석 #퍼포먼스마케팅 #데이터 #디지털마케팅

0개의 댓글