네이버증권 국내주식 테마 크롤링: (2)테마 번호로 개별종목 가져오기

들어가며

국내 주식 투자자들에게 테마 분석은 시장 흐름을 파악하고 투자 전략을 세우는 데 매우 중요한 요소입니다. 이번 포스팅에서는 네이버증권의 국내주식 테마 데이터를 크롤링하는 방법 중에서도 특히 ‘테마 번호로 개별 종목 가져오기’에 초점을 맞췄습니다. 이 과정은 데이터를 효율적으로 수집하여 더 나은 투자 결정을 내리는 데 큰 도움을 줄 것입니다. Python을 활용한 간단한 코드 예제와 함께 실전에서 바로 적용 가능한 방법을 자세히 다뤄보겠습니다.

테마번호로 개별종목 크롤링
네이버증권 2차전지 테마번호로 json 호출되는 API로 개별종목 크롤링

2차전지 테마 번호로 개별종목 반환되는 API 분석

2차전지 라는 테마의 종목 정보들을 볼 수 있는 API 호출 url 및 결과 json 입니다.

https://m.stock.naver.com/api/stocks/theme/503

결국 위 url에서 끝에 있는 503이 2차전지 테마 번호 입니다.

네이버증권 국내주식 테마 크롤링: (1)테마 번호 수집

위 포스팅에서 얻었던 네이버증권 국내주식 테마 번호 들을 순차적으로 반복문을 돌려서 반환되는 json을 파싱하여 csv로 저장하면 우리가 원하는 테마 번호와 개별종목 들을 연결할 수 있는 파일이 완성되는 것입니다.

아래 예시 JSON이 길지만 우리가 원하는 결과물을 얻기위해서 python 코드를 작성할 경우 반드시 필요한 자료입니다. 따라서 아래 JSON파일을 잘 활용하여 본 포스팅의 코드를 이해하는데 많은 도움이 되시길 바랍니다.

JSON
{
    "stockListSortType": "THEME",
    "stocks": [
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "037030",
            "reutersCode": "037030",
            "stockName": "파워넷",
            "sosok": "1",
            "closePrice": "2,340",
            "compareToPreviousClosePrice": "250",
            "compareToPreviousPrice": {
                "code": "2",
                "text": "상승",
                "name": "RISING"
            },
            "fluctuationsRatio": "11.96",
            "accumulatedTradingVolume": "387,399",
            "accumulatedTradingValue": "879",
            "localTradedAt": "2024-11-15T16:11:28+09:00",
            "marketValue": "512",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/037030"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "018290",
            "reutersCode": "018290",
            "stockName": "브이티",
            "sosok": "1",
            "closePrice": "30,950",
            "compareToPreviousClosePrice": "1,850",
            "compareToPreviousPrice": {
                "code": "2",
                "text": "상승",
                "name": "RISING"
            },
            "fluctuationsRatio": "6.36",
            "accumulatedTradingVolume": "1,460,908",
            "accumulatedTradingValue": "44,460",
            "localTradedAt": "2024-11-15T16:11:28+09:00",
            "marketValue": "11,079",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/018290"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "037370",
            "reutersCode": "037370",
            "stockName": "EG",
            "sosok": "1",
            "closePrice": "6,630",
            "compareToPreviousClosePrice": "210",
            "compareToPreviousPrice": {
                "code": "2",
                "text": "상승",
                "name": "RISING"
            },
            "fluctuationsRatio": "3.27",
            "accumulatedTradingVolume": "151,324",
            "accumulatedTradingValue": "1,029",
            "localTradedAt": "2024-11-15T16:11:14+09:00",
            "marketValue": "572",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/037370"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "032680",
            "reutersCode": "032680",
            "stockName": "소프트센",
            "sosok": "1",
            "closePrice": "313",
            "compareToPreviousClosePrice": "4",
            "compareToPreviousPrice": {
                "code": "2",
                "text": "상승",
                "name": "RISING"
            },
            "fluctuationsRatio": "1.29",
            "accumulatedTradingVolume": "845,623",
            "accumulatedTradingValue": "257",
            "localTradedAt": "2024-11-15T16:11:44+09:00",
            "marketValue": "330",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/032680"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "054300",
            "reutersCode": "054300",
            "stockName": "팬스타엔터프라이즈",
            "sosok": "1",
            "closePrice": "476",
            "compareToPreviousClosePrice": "4",
            "compareToPreviousPrice": {
                "code": "2",
                "text": "상승",
                "name": "RISING"
            },
            "fluctuationsRatio": "0.85",
            "accumulatedTradingVolume": "119,920",
            "accumulatedTradingValue": "55",
            "localTradedAt": "2024-11-15T16:11:58+09:00",
            "marketValue": "319",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/054300"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "125210",
            "reutersCode": "125210",
            "stockName": "아모그린텍",
            "sosok": "1",
            "closePrice": "6,310",
            "compareToPreviousClosePrice": "-190",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-2.92",
            "accumulatedTradingVolume": "177,995",
            "accumulatedTradingValue": "1,101",
            "localTradedAt": "2024-11-15T16:11:13+09:00",
            "marketValue": "1,041",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/125210"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "360070",
            "reutersCode": "360070",
            "stockName": "탑머티리얼",
            "sosok": "1",
            "closePrice": "30,000",
            "compareToPreviousClosePrice": "-1,250",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-4.00",
            "accumulatedTradingVolume": "51,048",
            "accumulatedTradingValue": "1,507",
            "localTradedAt": "2024-11-15T16:11:57+09:00",
            "marketValue": "2,423",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/360070"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "282880",
            "reutersCode": "282880",
            "stockName": "코윈테크",
            "sosok": "1",
            "closePrice": "13,540",
            "compareToPreviousClosePrice": "-650",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-4.58",
            "accumulatedTradingVolume": "259,330",
            "accumulatedTradingValue": "3,471",
            "localTradedAt": "2024-11-15T16:11:14+09:00",
            "marketValue": "1,509",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/282880"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "096770",
            "reutersCode": "096770",
            "stockName": "SK이노베이션",
            "sosok": "0",
            "closePrice": "96,100",
            "compareToPreviousClosePrice": "-6,600",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-6.43",
            "accumulatedTradingVolume": "720,543",
            "accumulatedTradingValue": "68,748",
            "localTradedAt": "2024-11-15T16:11:14+09:00",
            "marketValue": "92,002",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KS",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스피",
                "nameEng": "KOSPI",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSPI"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/096770"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "222080",
            "reutersCode": "222080",
            "stockName": "씨아이에스",
            "sosok": "1",
            "closePrice": "8,250",
            "compareToPreviousClosePrice": "-750",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-8.33",
            "accumulatedTradingVolume": "1,599,288",
            "accumulatedTradingValue": "13,277",
            "localTradedAt": "2024-11-15T16:11:43+09:00",
            "marketValue": "5,918",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/222080"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "234920",
            "reutersCode": "234920",
            "stockName": "자이글",
            "sosok": "1",
            "closePrice": "3,950",
            "compareToPreviousClosePrice": "-410",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-9.40",
            "accumulatedTradingVolume": "236,945",
            "accumulatedTradingValue": "942",
            "localTradedAt": "2024-11-15T16:11:58+09:00",
            "marketValue": "534",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KQ",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스닥",
                "nameEng": "KOSDAQ",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSDAQ"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/234920"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "066970",
            "reutersCode": "066970",
            "stockName": "엘앤에프",
            "sosok": "0",
            "closePrice": "97,500",
            "compareToPreviousClosePrice": "-12,100",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-11.04",
            "accumulatedTradingVolume": "718,976",
            "accumulatedTradingValue": "70,017",
            "localTradedAt": "2024-11-15T16:11:28+09:00",
            "marketValue": "35,389",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KS",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스피",
                "nameEng": "KOSPI",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSPI"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/066970"
        },
        {
            "stockType": "domestic",
            "stockEndType": "stock",
            "itemCode": "373220",
            "reutersCode": "373220",
            "stockName": "LG에너지솔루션",
            "sosok": "0",
            "closePrice": "371,000",
            "compareToPreviousClosePrice": "-51,000",
            "compareToPreviousPrice": {
                "code": "5",
                "text": "하락",
                "name": "FALLING"
            },
            "fluctuationsRatio": "-12.09",
            "accumulatedTradingVolume": "999,598",
            "accumulatedTradingValue": "382,170",
            "localTradedAt": "2024-11-15T16:11:43+09:00",
            "marketValue": "868,140",
            "nav": "N/A",
            "threeMonthEarningRate": "N/A",
            "marketStatus": "CLOSE",
            "tradeStopType": {
                "code": "1",
                "text": "운영.Trading",
                "name": "TRADING"
            },
            "stockExchangeType": {
                "code": "KS",
                "zoneId": "Asia/Seoul",
                "nationType": "KOR",
                "delayTime": 0,
                "startTime": "0900",
                "endTime": "1530",
                "closePriceSendTime": "1630",
                "nameKor": "코스피",
                "nameEng": "KOSPI",
                "stockType": "domestic",
                "nationCode": "KOR",
                "nationName": "대한민국",
                "name": "KOSPI"
            },
            "endUrl": "https://m.stock.naver.com/domestic/stock/373220"
        }
    ],
    "groupInfo": {
        "no": 503,
        "name": "2차전지(LFP/리튬인산철)",
        "totalCount": 13,
        "changeRate": "-2.70",
        "riseCount": 5,
        "fallCount": 8,
        "steadyCount": 0
    },
    "themeDescription": "리튬 계열 배터리 중 하나인 LFP(LiFePO4, 리튬·인산·철) 배터리 관련 업체. 니켈·코발트·망간 등 세 가지 물질을 혼합한 삼원계 배터리 대비 에너지밀도가 낮지만, 발열성이 낮아 안전성이 높은 것으로 평가받고 있음. 원재료로 들어가는 금속도 삼원계나 사원계 대비 저렴해 글로벌 전기차업체 테슬라가 보급형 전기차 기본 모델에 LFP 배터리를 적용했으며, 폴크스바겐·벤츠·BMW·현대차·포드 등 주요 완성차 업체들도 모두 LFP 배터리 탑재를 추진하고 있는 가운데, 전기차 화재 논란 이후 시장의 주목을 받고 있음.",
    "themeItemInfoMap": {
        "125210": "중국에서 LFP(리튬인산철) 셀을 외주 생산한 후 자체 공장에서 패키징 중(LFP 레시피 및 BMS 기술 보유).",
        "222080": "2차전지 전공정에 해당하는 Coater M/C, Calender M/C, Slitter M/C 및 Tape Laminator 생산 업체. LFP 전극용 건식 공정기술 개발과제를 진행중. LFP(리튬인산철) 배터리를 생산하는 中 CATL 등에 부품을 납품하고 있는 점이 시장에서 부각.",
        "234920": "웰빙 생활가전 전문업체. 22년12월 국내 유일의 LFP 배터리 사업의 연구 및 설비 자산(유무형)의 인수에 성공하여 이차전지 사업에 진출. 미국 합작유한회사 ZAICELL JV LLC의 설립 및 지분 확보.",
        "282880": "종속회사 탑머티리얼이 LFP(리튬인산철) 배터리 설계와 제조 능력을 보유. 탑머티리얼은 코발트프리 양극재(리튬인산철)를 개발해 전기 이륜차 배터리 등에 납품중.",
        "360070": "24년2월 LFP 배터리 양극재 개발을 완료, 141.23억원(자기자본대비 9.12%) 규모 이차전지 LFP양극재 사업을 위한 생산시설 구축(설비투자) 결정.",
        "373220": "LG그룹 계열의 전지사업 전문 업체. LG화학의 전지사업 부문이 물적분할되어 설립. LFP(리튬인산철) 배터리 사업 진출을 공식화했으며, ESS용 LFP 배터리 개발 진행중.",
        "096770": "배터리사업 신설법인 SK온(ON)이 리튬인산철(LFP) 배터리 개발을 고려중인 점이 시장에서 부각.",
        "018290": "차세대 리튬-황 배터리 개발을 위해 중소기업기술정보진흥원이 주관하는 2021년 Tech-Bridge 활용 상용화기술개발 사업에 한국전기연구원과 공동으로 지원 대상에 선정, 주관연구기관으로 기술 개발에 참여하며, 최종적으로 경량, 고에너지 밀도의 리튬-황 전지용 양극을 생산할 계획.",
        "037030": "LFP(리튬인산철) 국제인증 취득 및 배터리 팩 모듈 개발을 영위하는 업체.",
        "037370": "LFP(리튬인산철) 배터리의 원료로 사용되는 산화철 관련 사업을 영위중. 세계 최고수준의 고순도산화철 순도 99.4%이상의 산화철을 생산하고 있으며, 세계일류상품인 고순도 산화철 부분은 점유율 1위와 세계 최대의 산화철 생산규모를 가지고 있음.",
        "054300": "팬스타그룹이 국내 최초로 이동통신기지국 비상전원용 리튬인산철(LFP) 배터리 시스템을 일본에 공급한 점이 시장에서 부각. 팬스타그룹은 국내에서는 팬스타트리와 팬스타엔터프라이즈, 일본에서는 현지 법인인 산스타라인과 협업을 진행중.",
        "032680": "24년2월 리튬·인산·철(LFP) 배터리 검사장비가 ONE(Our Next Energy) 미국 현지 공장 테스트 성공. 동사가 ONE에 공급한 검사장비는 방사선(X-Ray)의 투과 원리를 이용하여 2차전지의 음극 양극 간격을 검사해 화재,단락 등의 배터리 불량을 방지하는 장비임.",
        "066970": "LFP 배터리 전문회사인 아워넥스트에너지(ONE)와 LFP 공급을 위한 MOU를 체결했으며, 중국 전구체 기업 CNGR과 FTA 역내에 LFP를 포함한 미국 인플레이션감축법(IRA) 대응 중장기 업무협약(MOU)을 체결. 24년7월 산업통상자원부가 추진하는 리튬인산철(LFP) 배터리 기술 개발’ 국책과제 주관기업으로 선정."
    },
    "totalCount": 13,
    "page": 1,
    "pageSize": 20,
    "localOpenTimeDesc": "",
    "marketStatus": "CLOSE"
}

테마 번호로 개별종목 가져오는 Python 코드

아래 파이썬 코드를 실행하면 위 json파일의 종목들을 수집하여 csv파일로 저장을 할 수 있습니다. 만약 파이썬 코드 실행하는 법을 모른다면 아래 이전 포스팅을 참고하시기 바랍니다.

네이버증권 국내주식 테마 크롤링: (1)테마 번호 수집

Python
import requests
import pandas as pd

# theme_data.csv 파일 읽기
theme_df = pd.read_csv("theme_data.csv")
themes = theme_df[['theme_num', '테마명']].to_dict(orient='records')  # theme_num과 테마명 컬럼을 딕셔너리 리스트로 변환

# API에서 추출한 데이터를 저장할 리스트
all_theme_data = []

# 각 theme_num에 대해 API 요청을 반복
for theme in themes:
    theme_num = theme['theme_num']
    theme_name = theme['테마명']
    page = 1
    page_size = 100
    theme_data = []

    while True:
        # 각 theme_num에 맞는 URL 설정 및 API 호출
        base_url = f"https://m.stock.naver.com/api/stocks/theme/{theme_num}"
        url = f"{base_url}?pageSize={page_size}&page={page}"
        response = requests.get(url)
        data = response.json()

        # 그룹 정보에서 총 개수 확인
        total_count = data['groupInfo']['totalCount']
        
        # stocks 리스트에서 필요한 값 추출
        for stock in data['stocks']:
            item_code = stock['itemCode']
            stock_name = stock['stockName']
            stock_exchange_name_kor = stock['stockExchangeType']['nameKor']
            theme_data.append({
                "테마ID": theme_num,
                "테마명": theme_name,
                "종목ID": item_code,
                "종목명": stock_name,
                "시장구분": stock_exchange_name_kor
            })
        
        # 페이지 넘김 여부 결정
        if total_count <= page_size * page:
            break
        page += 1

    # 테마별 데이터를 all_theme_data에 추가
    all_theme_data.extend(theme_data)

# DataFrame으로 변환 후 CSV로 저장
all_theme_df = pd.DataFrame(all_theme_data)
all_theme_df.to_csv("all_theme_stock_data.csv", index=False, encoding='utf-8-sig')

print("모든 테마 데이터와 테마명을 포함하여 CSV 파일로 저장했습니다.")

마치며

테마 번호를 기반으로 개별 종목 데이터를 크롤링하는 방법은 투자 데이터 분석의 첫걸음이라 할 수 있습니다. 이번 포스팅을 통해 네이버증권 데이터를 활용해 투자에 필요한 정보를 손쉽게 얻는 방법을 익히셨길 바랍니다. 향후 다양한 테마 데이터를 활용한 심층 분석 방법도 소개할 예정이니 많은 관심과 기대 부탁드립니다.

지금 바로 Python 코드를 실행해 보고 데이터를 탐구해 보세요!

그래서 더 좋은 선택을 하시기 바라겠습니다.^^

댓글 남기기

Leave a Comment