• 제출일: 2024년 6월 10일 월요일
  • 제출자: 배정환 인턴

이번 과제는 과제를 해결해나가는 과정을 날짜별로 정리하여 하겠다.

세부과제

Todo

  1. 네이버 OPEN API 이용
  • 검색어에 대한 20개의 상품을 찾는다.
  • 중고, 렌탈은 제외한다.
  1. Pandas를 이용한 데이터프레임 저장
  • 출력된 각 key들의 의미에 대해 이해한다.
  • (column: 상품id, 상품명, 제조사, 최저가, 이미지링크, 구매링크)을 가진 데이터프레임을 만든다.(변수명은 자유)
  • csv로 저장한다.
  1. Python 코드로 함수 작성
  • 키워드(검색어)만 입력하면 바로 저장될 수 있도록 함수를 만든다.

목표

업무 자동화 시스템을 만들면서 OPEN API에 대한 이해와 데이터 저장에 대한 스킬을 높인다.

Tip

  • 모든 정보에 대한 검색은 공식 문서를 가장 먼저 확인해보는 것이 좋다.

Reference

  1. 네이버 OPEN API에 대한 가이드
  2. Pandas API reference
  3. Python Documentation

2024-06-05

  1. 일단 처음 API 를 함수에 연결하는 법에 대해서부터 해본다.
    • display=20: 검색어에 대한 20개의 상품이 출력되도록 했다.
    • &exclude=used:rental: 중고와 렌탈을 제외했다.
import os
import urllib.parse
import urllib.request
 
from dotenv import load_dotenv
load_dotenv()
 
def searh_naver_shopping(keyword):
    client_id = os.getenv("NAVER_CLIENT_ID")
    client_key = os.getenv("NAVER_CLIENT_KEY")
    encrypt_text = urllib.parse.quote(keyword)
 
    url = "https://openapi.naver.com/v1/search/shop?query="+ encrypt_text +"&display=20&exclude=used:rental"
 
    req_url = urllib.request.Request(url)
    req_url.add_header("X-Naver-Client-Id", client_id)
    req_url.add_header("X-Naver-Client-Secret", client_key)
 
    response = urllib.request.urlopen(req_url)
    resp_code = response.getcode()
 
    if resp_code == 200:
        shop_output = response.read().decode("utf-8")
    else:
        shop_output = "Error" + resp_code
    return shop_output
 
keyword_input = searh_naver_shopping("반팔티")
print(keyword_input)
  • 첫번째 과제 Clear

  1. Pandas를 이용한 데이터프레임 저장
  • 위의 코드로 받은 json파일은 string으로 되어있다. 이를 바꿀려면
import json
 
# 받은 json파일의 텍스트를 text로 칭할 때
json.loads(text)
  • csv파일로 바꾸기 위해서는 to_csv()함수를 써야한다고 하셨다.

  • pandas에서 json파일을 읽는 방법

  • read_json함수에 path를 넣으면 되지 않을까?

  • 일단 함수에 나오는 출력값을 json파일에 옮겨 넣어야한다.

  • Python 파일 입출력

  • json.load와 json.loads의 차이

import json
import pandas as pd
 
json_input = json.loads(keyword_input)
# print(json_input)
print(json.dumps(json_input))
# shop_review=pd.read_json(path_or_buf="", orient=json_input)
with open("naver_news_shopping.json", 'w', encoding="utf-8") as json_file:
    json.dump(json_input, json_file, ensure_ascii=False, sort_keys=True, indent="\t")

2024-06-07

  • json파일로 만든 것을 보고 DataFrame으로 만든다.
    • column: 상품id, 상품명, 제조사, 최저가, 이미지링크, 구매링크)을 가진 데이터프레임을 만든다.(변수명은 자유)
    • 이때 read_json을 쓰면 될거 같다.
    • pandas.read_json
# naver_news_shopping.json의 경로를 설정해준다.
df = pd.read_json('naver_shopping.json')
df

2024-06-08

Key value in JSON file to columns in DataFrame

  • rename에 대한 방법
  • set_axis에 대한 방법 set_axis
  • rename_axis에 대한 방법
  • pivot_table에 대한 방법 - item열에 있는 것을 columns로 바꾼다는 아이디어

2024-06-09

  • stackoverflow에서 찾은 방법
  • json_normalize 문서
  • items column에 있던 value를 json_normalize() 함수를 써서 그 row에 있는 value들만 dataframe에 집어 넣었다.
  • json_input은 API에서 받은 데이터 list이다.
  • 그중 items항목을 지정해서 value값으로 되어있는데 상품ID,상품명등을 분리할 수 있었다.
from pandas import json_normalize
 
shopping_info = json_normalize(json_input["items"])
shopping_info

  • json_normalize에 대해서는 내일 회사 가서 좀 더 자세히 봐야겠다.

  • 남은 과제 :

    • 이 DataFrame의 불필요한 column들 삭제하고 조건에 맞게 만들고 CSV파일로 저장하기
    • 함수에 DataFrame만드는거 까지 연결해서 함수에 키워드를 집어 넣으면 자동으로 csv파일 만들어지게 하기
  • 두번째 과제 Clear


2024-06-10

  • loc함수를 사용해 원하는 항목으로 추리기
shopping_data = shopping_info.loc[:, ["productId","title","brand","lprice","image","link"]]
 
shopping_data

  • set_index()를 사용해서 product_Id를 index로 설정한다.
shopping_data1 = shopping_data.set_index("productId")
 
shopping_data1

  • to_csv()함수를 사용해서 경로를 설정한 후 csv파일 만들기
shopping_data1.to_csv("C:/Users/pps/Desktop/TIL/shopping_data.csv")
  • 이제 모든 코드를 모아서 한 함수에 집어 넣는다.
  • json_path와 csv_path 를 넣어서 json파일이 어떤 이름으로 저장될지와 csv파일이 어디 경로에 넣어질지 정한다.
# 모든 과정을 함수에 담기
import os
import urllib.parse
import urllib.request
import json
import pandas as pd
 
from dotenv import load_dotenv
load_dotenv()
 
def searh_naver_shopping(keyword, json_path, csv_path):
    client_id = os.getenv("NAVER_CLIENT_ID")
    client_key = os.getenv("NAVER_CLIENT_KEY")
    encrypt_text = urllib.parse.quote(keyword)
    url = "https://openapi.naver.com/v1/search/shop?query="+ encrypt_text +"&display=20&exclude=used:rental"
    
    req_url = urllib.request.Request(url)
    req_url.add_header("X-Naver-Client-Id", client_id)
    req_url.add_header("X-Naver-Client-Secret", client_key)
    response = urllib.request.urlopen(req_url)
    resp_code = response.getcode()
  
    if resp_code == 200:
        shop_output = response.read().decode("utf-8")
    else:
        shop_output = "Error" + resp_code
    json_input = json.loads(shop_output)
 
    with open(json_path, 'w', encoding="utf-8") as json_file:
        json.dump(json_input, json_file, ensure_ascii=False, sort_keys=True, indent="\t")
        
    shopping_info = json_normalize(json_input["items"])
    shopping_data = shopping_info.loc[:, ["productId","title","brand","lprice","image","link"]]
 
    shopping_data.replace('<b>|</b>','', regex=True, inplace=True)
    shopping_data1 = shopping_data.set_index("productId")
    shopping_data1.to_csv(csv_path)
 
searh_naver_shopping("바지","pants_shopping.json","C:/Users/pps/Desktop/TIL/pants_shopping_info.csv")
  • 정규식을 이용한 문자열 바꾸기
    • to_replace: str(문자열), regex(정규 표현식), list(리스트), dict(딕셔너리), Series(시리즈), int(정수형), float(실수형), None. 대체될 값을 찾는 방법
      • 숫자형, 문자열 or 정규 표현식:
        • 숫자형numeric : 같은 값을 갖는 숫자를 value의 값으로 바뀐다.
        • 문자열str : to_replace과 정확히 일치하는 문자열이 value의 값으로 바뀐다.
        • 정규 표현식regex : to_replace의 정규 표현식과 일치하는 요소를 value의 값으로 바뀐다.
    • inplace: 원본을 변경할지 여부
    • regex: to_replace와/또는 value를 정규식으로 표현할지 여부
  • replace함수를 이용해 title열에 bold로 되어있는 문자열 <b>,</b>를 삭제한다.
shopping_data.replace('<b>|</b>','', regex=True, inplace=True)
  • str.replace()를 이용한 문자열 바꾸기
    • 문자열 일부만 있더라도 바꾸기 가능
shopping_data["title"] = shopping_data["title"].str.replace('<b>','')
shopping_data["title"] = shopping_data["title"].str.replace('</b>','')