[EDA] mini project 2 _ 화장품 판매처_Naver API

jaam._.mini·2023년 12월 13일
0
post-thumbnail

📌writer.save → writer.close() 로 변경


  • 에러 발생
  • 에러 검색
  • 에러 해결





Naver API 등록






Mini project

  • 상품 검색
  • 데이터 수집
  • 데이터 시각화

setting

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 결과

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 만들기


#함수 요청 url(인자들: 쇼핑몰/블로그/카페인지, 검색어, 몇번째 부터 검색할 것인가 , 몇개를 출력할 것인가 ):
def gen_search_url(api_node, search_text, start_num, disp_num):

    # 위 url을 작성. url = "https://openapi.naver.com/v1/search
    base = 'https://openapi.naver.com/v1/search'
    
    # 그 다음 작성. /shop -> / 문자열 json형태로 받을 것임
    node = '/' + api_node + '.json'
    
    # 그 다음 작성. encText = urllib.parse.quote("파이썬")
    # param_query 는 '?query=' 로 잡아줘야 함 + 찾고자 하는 text붙여주
    param_query = '?query=' + urllib.parse.quote(search_text)
    
    # &(앤드) 기호 반드시 붙어여 함 + str로 바꿔서 붙여
    param_start = '&start=' + str(start_num)
    param_disp = '&display=' + str(disp_num)

    # 위 변수들을 모두 더해줌
    # str로 맞췄기 떄문에 잘 붙여짐
    return base + node + param_query + param_start + param_disp

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 = '&display=' + str(disp_num)
    return base + node + param_query + param_disp + param_start
# shop에 데이를 던져주고, TEST 라는 단어로 검색을 할 것임
# start_num 10번 이고, disp_num는 3개까지 보여주세요
gen_search_url('shop', 'TEST', 10, 3)
  • 결과 ▼
'https://openapi.naver.com/v1/search/shop.json?query=TEST&display=3&start=10'




(2) get_result_onepage()

  • 하나의 페이지에서 데이터를 받아오는 함수


import json
import datetime
                    # ▼ 위에서 만든 url이 들어감
def get_result_onpage(url):

    # 요청하고 싶은 url을 넣음
    request = urllib.request.Request(url)

    # header값을 설정
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)

    # 위에서 요청한 url을 열어 줌
    response = urllib.request.urlopen(request)

    # 써주고, 앞 %에 들어갈 내용을 뒤에 써줌 (%현재시간)
    print('[%s] Url Request Success' % datetime.datetime.now())

    # json으로 열어줌
    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
  • 결과 ▼




(3) get_fields()

  • 데이터 프레임으로 만드는 기능

  • 각 아이템별 값을 보고 싶다면
  • 위에 출력된 컬럼들을 보고 아래 처럼 검색하면 됨


  • DataFrame 만들기
  • 데이터 프레임 만들기

import pandas as pd
# jason 형태의 data를 넣어 줌
def get_fields(json_data):
    
    # json_data 안 items 에서 한개씩 each 변수에 가져 옴
    # each는 title을 가져와서 delete_tag(하나씩) 저장을 해라
    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']]

    # 데이터 프레임을 만들어 줌
    # column 순서 : [] 설정 
    # return : 데이터 프레임 저장 & 출력
    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()

  • html태그를 제거해서 출력할 수 있도록 해주는 기능

def delete_tag(input_str):

    # replace : 들어온 스트링에 <b>이런 모양이 있으면 ' '로 바꿔줘.
    input_str = input_str.replace('<b>','')
    input_str = input_str.replace('</b>','')
    return input_str
# shop에다 데이터를 요청할거고, 검색어는 몰스킨, 첫 페이지 부터, 5페이지까지 보여줘
# url 만들고
url = gen_search_url('shop', '몰스킨', n, 100)
    
# json으로 응답 받고
json_result = get_result_onpage(url)
    
# 응답 받은 걸 DataFrame으로 만들어 주고
pd_result = get_fields(json_result)




(5) actMain()

  • 데이터를 모으는 작업


# 1부터 1000까지 100단위
for n in range(1,1000,100):
    print(n)
result_mol = []

for n in range(1, 1000, 100):

    # url 만들고 (위 for문의 숫자가 n에 각각 들어가서, 100개씩 출력)
    url = gen_search_url('shop', '몰스킨', n, 100)
    
    # json으로 응답 받고
    json_result = get_result_onpage(url)
    
    # 응답 받은 걸 DataFrame으로 만들어 주고
    pd_result = get_fields(json_result)

    # 리스트에 추가
    result_mol.append(pd_result)

# concat으로 모아줌
result_mol = pd.concat(result_mol)
result_mol.reset_index(drop=True, inplace=True)
# reset_index 인덱스 재설정
result_mol.reset_index()
# 앞에 숫자 한줄 지워주고
result_mol.reset_index(drop=True)
result_mol.info()

result_mol.reset_index(drop=True, inplace=True)
result_mol.info()

# 0 to 999 : 0~999 까지 재정렬 된 것을 확인 할 수 있음




(6) price - datatype 바꾸기


# .astype('float') : float 형태로 바꿔줌
result_mol['lprice'] = result_mol['lprice'].astype('float')
result_mol.info()




(7) to_excel()

  • 엑셀로 내보내기 기능 사용
# !pip install xlsxwriter

  • 엑셀을 파이썬으로 입력하는 작업
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']

# A행과 열, 간격 : 4칸
worksheet.set_column("A:A", 4)
worksheet.set_column("B:B", 80) # ← 글자가 넘치면 숫자를 올려주면 해결 됨
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.close()




(8) 시각화

  • 미리 만들어 놓은 'window 한글' import
  • 위 자료들 중 mall 컬럼 시각화

import set_matplotlib_hangul
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(15,6))

# countplot : 개수를 출력해주는 그래프
sns.countplot(

    # x축 : result_mol의 mall 컬럼
    x = result_mol['mall'],
    data=result_mol,
    palette='RdYlGn',

    # value_counts : 밸류도 갯수 확인
    order=result_mol['mall'].value_counts().index
)
# 이름이 겹치지 않고 세로로 세워지게 하는 기능
plt.xticks(rotation=90)


plt.show()

  • 결과 ▼







(참고) 그래프 종류


countplot() : 개수를 출력해주는 그래프를
참고할 수 있는 사이트를 가져와 봄
참고


제로베이스 데이터 스쿨
profile
비전공자의 데이터 공부법

0개의 댓글