[zero-base/] DS Part 4. EDA - 33일차 스터디 노트

손윤재·2024년 1월 16일

제로베이스 DS 22기

목록 보기
34/55
post-thumbnail

실습 프로젝트 6️⃣

【Naver 검색 API】 "몰스킨" 상품 데이터 분석


네이버 쇼핑 검색 API

상품 “몰스킨” 검색하고 쇼핑 정보를 취득하는 과정을 차례대로 함수화한다.


🔰 gen_search_url()

  • 검색 요청 url을 생성하는 함수이다.

  • 파라미터(요청 변수)들을 url에 포함시켜야 한다.

  • 한 번에 표시될 수 있는 검색 결과(display)의 최대값은 100개이다.
    만약 1000개의 데이터를 얻고 싶다면, start 파라미터를 이용해 시작값을 start=1, start=101, ..., start=901 방식으로 지정해준다.

    import urllib

    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)
    // 'https://openapi.naver.com/v1/search/shop.json?query=Test&start=10&display=3'

🔰 get_result_onepage()

  • url로 웹에 접근해 내용을 json으로 가져와 글자로 decode 해주는 함수이다.
    import json
    import datetime
    from urllib.request import Request, urlopen

    def get_result_onepage(url):
        client_id = "*************"
        client_secret = "******"

        request = Request(url)
        request.add_header("X-Naver-Client-Id", client_id)
        request.add_header("X-Naver-Client-Secret", client_secret)

        response = 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_onepage(url)
    // [2024-01-16 07:40:02.174472] URL Request Success

    one_result //--> 리스트 형태이다.


🔰 get_fields()

  • 검색 정보를 pandas DataFrame으로 만드는 함수이다.
    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_df = pd.DataFrame({
            "title": title,
            "lprice": lprice,
            "link": link,
            "mall": mall_name,
        })
        return result_df

    get_fields(one_result)


🔰 delete_tag()

  • 제목에 강조를 위해 붙은 <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_df = pd.DataFrame({
            "title": title,
            "lprice": lprice,
            "link": link,
            "mall": mall_name,
        })
        return result_df

    get_fields(one_result)


🔰 actMain()

  • 지금까지의 과정을 종합해 1000개의 데이터를 모두 모으는 함수이다.
    def actMain(api_node, search_text):
        total_result = []
        for n in range(1, 1000, 100):
            url = gen_search_url(api_node, search_text, n, 100)
            json_result = get_result_onepage(url)
            df_result = get_fields(json_result)

            total_result.append(df_result)

        total_result = pd.concat(total_result)
        return total_result
    result_molskin = actMain("shop", "몰스킨")
    /*실행결과
        [2024-01-16 15:45:08.584349] URL Request Success
        [2024-01-16 15:45:08.902149] URL Request Success
        [2024-01-16 15:45:09.211957] URL Request Success
        [2024-01-16 15:45:09.494204] URL Request Success
        [2024-01-16 15:45:09.778892] URL Request Success
        [2024-01-16 15:45:10.077416] URL Request Success
        [2024-01-16 15:45:10.372764] URL Request Success
        [2024-01-16 15:45:10.706020] URL Request Success
        [2024-01-16 15:45:11.014197] URL Request Success
        [2024-01-16 15:45:11.331348] URL Request Success
    */
    result_molskin


🔰 엑셀로 저장

  • 파이썬으로 엑셀을 다루는 xlsxwriter 모듈을 이용해 데이터를 저장한다.
    writer = pd.ExcelWriter(
        "./result_data/06_molskin_diary_in_naver_shop.xlsx",
        engine="xlsxwriter"
    )
    result_molskin.to_excel(writer, sheet_name="Sheet1")

    workbook = writer.book 
    worksheet = writer.sheets["Sheet1"]
    worksheet.set_column("A:A", 4)
    worksheet.set_column("B:B", 70)
    worksheet.set_column("C:C", 10)
    worksheet.set_column("D:D", 50)
    worksheet.set_column("E:E", 30)
    worksheet.set_column("F:F", 10)

    worksheet.conditional_format("C2:C1001", {"type": "3_color_scale"})
    writer.close()


🔰 시각화

    plt.figure(figsize=(15, 7))
    sns.countplot(
        data=result_molskin,
        x=result_molskin["mall"],
        palette="RdYlGn",
        order=result_molskin["mall"].value_counts().index
    )
    plt.xticks(rotation=90)
    plt.show()

profile
ISTP(정신승리), To Be Data Scientist

0개의 댓글