"마스크팩" 상품을 검색해보자 !
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
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_node = 쇼핑몰 / 블로그 / 카페 / 등등
# search_text = 검색어
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_start + param_disp
gen_search_url("shop", "TEST", 10, 3)

잘 출력되었다 !
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())
return json.loads(response.read().decode("utf-8"))
url = gen_search_url("shop", "마스크팩", 1, 5)
one_result = get_result_onpage(url)

one_result

one_result["items"]

one_result["items"][0]

one_result["items"][0]["title"]

one_result["items"][0]["link"]

one_result["items"][0]["lprice"]

one_result["items"][0]["mallName"]

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)

그런데 title 출력 결과에 b 태그가 있다. (검색어를 강조하는 태그)
def delete_tag(input_str):
input_str = input_str.replace("<b>", "")
input_str = input_str.replace("</b>", "")
return input_str
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)

이 때까지의 내용을 정리하면,
1. URL을 만들어내고 2. 그 response를 받아서 3. dataframe 으로 정리하였다.
url = gen_search_url("shop", "마스크팩", 1, 5)
json_result = get_result_onpage(url)
pd_result = get_fields(json_result)
pd_result

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

총 1000개의 data가 들어왔으므로 데이터가 잘 확보되었다.
그런데, 데이터는 1000개인데 index는 0~99이므로 index 수정이 필요해보인다.
result_mol.reset_index(drop=True, inplace=True)
result_mol.info()

result_mol.tail()

또한, 가격 lprice가 object 형이므로 float형으로 변환시켜야 한다.
result_mol["lprice"] = result_mol["lprice"].astype("float")
result_mol.info()

plt.figure(figsize=(15, 6))
sns.countplot(
x = result_mol["mall"],
data=result_mol,
palette="RdYlGn",
order=result_mol["mall"].value_counts().index
)
# x 축이 세워짐
plt.xlim([0, 9])
plt.xticks(rotation=90)
plt.show()

마스크팩 검색 결과, 쇼핑몰 중 네이버 비율이 압도적으로 높은 것을 확인