- 제출일: 2024년 6월 10일 월요일
- 제출자: 배정환 인턴
이번 과제는 과제를 해결해나가는 과정을 날짜별로 정리하여 하겠다.
세부과제
Todo
- 네이버 OPEN API 이용
- 검색어에 대한 20개의 상품을 찾는다.
- 중고, 렌탈은 제외한다.
- Pandas를 이용한 데이터프레임 저장
- 출력된 각 key들의 의미에 대해 이해한다.
- (column: 상품id, 상품명, 제조사, 최저가, 이미지링크, 구매링크)을 가진 데이터프레임을 만든다.(변수명은 자유)
- csv로 저장한다.
- Python 코드로 함수 작성
- 키워드(검색어)만 입력하면 바로 저장될 수 있도록 함수를 만든다.
목표
업무 자동화 시스템을 만들면서 OPEN API에 대한 이해와 데이터 저장에 대한 스킬을 높인다.
Tip
- 모든 정보에 대한 검색은 공식 문서를 가장 먼저 확인해보는 것이 좋다.
Reference
2024-06-05
- 일단 처음 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
- Pandas를 이용한 데이터프레임 저장
- 위의 코드로 받은 json파일은 string으로 되어있다. 이를 바꿀려면
import json
# 받은 json파일의 텍스트를 text로 칭할 때
json.loads(text)-
csv파일로 바꾸기 위해서는
to_csv()함수를 써야한다고 하셨다. -
pandas에서 json파일을 읽는 방법

-
read_json함수에 path를 넣으면 되지 않을까? -
일단 함수에 나오는 출력값을 json파일에 옮겨 넣어야한다.
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')
df2024-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 문서
itemscolumn에 있던 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의 값으로 바뀐다.
- 숫자형
- 숫자형, 문자열 or 정규 표현식:
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>','')