웹 사이트에 있는 데이터를 수집하려고 할 때!!!
-
- api : best
-
- 일반적인 사이트
- 2-0) 아주 투명한 친구들 : 주소도 뭔가 원한느 입력에 바로 반응..별 허들X
- 2-1) DART : 주소가 숨겨져 있는 친구들!!! --> 이리저러 찾아야 함!!
- 2-2) daum
- 금융
- 숨겨진 주소를 찾아서 해도 안 될 때가 존재함
- 웹브라우저에서는 동작 but 코드는 안 될 때
- user-agent : 접속하는 sw
- referer : 해당 주소를 어느 주소에서 호출
- 쿠키 …
- 금융
-
- 브라우저 기반으로 내가 코드로 제어 : 셀레니움 ( 접속, 로그인 )
- 큰 틀
- 셀레니움( 접속, 로그인 )
- 내부 : requests/ urllib 코드쏘면서 진행..…
- ⇒ 이런 부분들은 정답이 없다!
- 큰 틀
- 브라우저 기반으로 내가 코드로 제어 : 셀레니움 ( 접속, 로그인 )
import urllib.request
url = 'https://finance.daum.net/'
res = urllib.request.urlopen(url)
res.read().decode("utf-8")
'''
<!DOCTYPE html>
<html lang="ko" class="os_mac"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta property="og:site_name" content="다음금융" />
<meta property="og:image" content="https://t1.daumcdn.net/media/finance/images/finance_og_250113.png" />
<link rel="shortcut icon" href="https://t1.daumcdn.net/top/favicon/20241223/daum.ico">
<title>다음 금융</title>
<link rel="stylesheet" type="text/css" href="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/commonCSSBundle.merged.css" />
<script src="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/pcFramework.merged.js"></script>
<script>
window.REQUEST_URI = '/home';
window.CURRENT_URL = encodeURIComponent(
"".concat(
window.location.protocol,
"//",
window.location.host,
window.location.pathname,
window.location.search
)
);
window.FINANCE = {};
window.FINANCE.API_URL = '';
window.FINANCE._PERIOD = '';
window.FINANCE.DAUM_NEWS_HOST = 'https://v.daum.net/v';
window.FINANCE.BOARD_HOST = 'https://board2.finance.daum.net';
window.FINANCE.WISE_FN_HOST = 'https://wisefn.finance.daum.net/v1';
</script>
<script type="text/javascript" src="https://t1.daumcdn.net/tiara/js/v1/tiara.min.js"></script>
</head>
<body class="finance">
<div id="wrap">
<div id="kakaoWrap">
<div id="wrapMinidaum"></div>
</div>
<script src="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/miniDaum.merged.js"></script>
<div class="header">
<div class="head_media f_clear">
<h1><a href="/" id="kakaoServiceLogo" class="#gnb #default #service_finance"><span class="ir_wa">금융</span></a></h1>
<strong class="screen_out">관련서비스</strong>
<h2 class="screen_out">검색</h2>
<div class="search_news" id="boxSearch"></div>
<script src="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/searchBundle.merged.js"></script>
</div>
<div id="kakaoGnb" role="navigation">
<div class="inner_gnb">
<h2 class="screen_out">금융 메인메뉴</h2>
<ul class="gnb_comm">
<li class="on">
<a href="/" class="link_gnb link_gnb1">
<span class="screen_out">선택됨</span>
<span class="ir_wa">홈</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
<li class="">
<a href="/domestic" class="link_gnb link_gnb2">
<span class="ir_wa">국내</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
<li class="">
<a href="/global" class="link_gnb link_gnb3">
<span class="ir_wa">해외</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
<li class="">
<a href="/news" class="link_gnb link_gnb4">
<span class="ir_wa">뉴스</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
<li class="">
<a href="/investment" class="link_gnb link_gnb5">
<span class="ir_wa">투자정보</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
<li class="">
<a href="/talks" class="link_gnb link_gnb6">
<span class="ir_wa">종목토론</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
<li class="">
<a href="/my" class="link_gnb link_gnb8">
<span class="ir_wa">MY</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
</ul>
<div class="gnb_etc">
<ul class="gnb_with">
<li class="">
<a href="/exchanges" class="link_gnb link_gnb1">
<span class="ir_wa">환율</span>
<span class="bar_gnb"><span class="inner_bar"></span></span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="notice"></div>
<link rel="stylesheet" type="text/css" href="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/layerpopupCSS.merged.css" />
<div class="stockB" id="boxTodayIndexes">
<div class="center">
<div class="stock" id="boxIndexes"></div>
<div class="stockTab" id="boxIndexTabs">
<span>
<h4>오늘의 증시</h4>
<p id="labTodayDate"></p>
<p id="labGlobalTodayDate">현지시간 기준</p>
</span>
<ul>
<li><a href="javascript:void(0)" data-type="DOMESTIC" class="on" title="국내 지수">국내 지수</a></li>
<li><a href="javascript:void(0)" data-type="USA" title="미국 지수">미국 지수</a></li>
<li><a href="javascript:void(0)" data-type="ASIA" title="아시아 지수">아시아 지수</a></li>
<li><a href="javascript:void(0)" data-type="EUROPE" title="유럽 지수">유럽 지수</a></li>
</ul>
</div>
</div>
</div>
<div class="mainB">
<div class="leftW">
<div class="topNews" id="boxTodayNews"></div>
<div class="rankingB" id="boxBestSearchs"></div>
<div class="rankingB line" id="boxTopSectors">
</div>
</div>
<div class="rightW" id="boxRightSidebar">
<div class="btnB">
<a href="javascript:void(0)" title="전 종목 시세 보기" id="btnAllQuotes"><i>-</i>전 종목 시세 보기</a>
</div>
<div class="myB" id="boxMy"></div>
<div class="sponsor"></div>
</div>
</div>
<div class="investmentB">
<div class="center" id="boxColumns">
</div>
</div>
<div class="mainB last">
<div class="leftW max">
<div class="rankingB" id="boxMarketTrend"></div>
</div>
</div>
<script src="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/homeBundle.merged.js"></script>
<div class="footer">
<span>
<div class="fl">
<ul>
<li><a target='_blank' href="http://policy.daum.net/info/info" title="서비스 약관/정책">서비스 약관/정책</a></li>
<li><a target='_blank' href="http://cs.daum.net/faq/19.html" title="금융 고객센터">금융 고객센터</a></li>
<li><a target='_blank' href="https://cs.daum.net/question/19.html" title="금융 문의하기">금융 문의하기</a></li>
</ul>
<p>카카오가 제공하는 증권정보는 단순히 정보의 제공을 목적으로 하고 있으며, 사이트에서 제공되는 정보는 오류 및 지연이<br>발생될 수 있습니다. 제공된 정보이용에 따르는 책임은 이용자 본인에게 있으며, 카카오는 이용자의 투자결과에 따른<br>법적 책임을 지지 않습니다.</p>
</div>
<div class="fr">
<p>위 내용에 대한 저작권 및 법적 책임은 자료제공사 또는<br>글쓴이에 있으며 카카오의 입장과 다를 수 있습니다.</p>
<p>Copyright (C) Kakao Corp. All rights reserved.</p>
</div>
</span>
</div>
<script>
window._TIARA_OPTIONS = {
section: '홈',
page: '홈'
}
</script>
<script src="https://t1.daumcdn.net/media/kraken/finance/resources/dist/250717161801/tiara.merged.js"></script>
</div>
</body>
</html>
'''
⇒ 에러는 안 나고 잘 접속이 도고 뭔가 정보를 주긴 했는데 알맹이가 아니라 껍데기를 줬음

https://finance.daum.net/api/search/ranks?limit=10
- 찾은 인기 종목 10종목에 대한 정보를 요청하는 주소를 찾아냈음!!
- 브라우저에 실행!!! 잘 됨!!!

url = '<https://finance.daum.net/api/search/ranks?limit=10>'
res = urllib.request.urlopen(url)
res.read().decode("utf-8")
'''
{
"data" : [ {
"rank" : 1,
"rankChange" : 0,
"symbolCode" : "A034020",
"shortCode" : "A034020",
"code" : "KR7034020008",
"name" : "두산에너빌리티",
"isNew" : false,
"tradePrice" : 61500,
"change" : "RISE",
"changePrice" : 4100,
"changeRate" : 0.0714285714,
"signedChangeRate" : 0.0714285714,
"accTradeVolume" : 17052577,
"accTradePrice" : 1039924462500,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A034020#talks>"
}, {
"rank" : 2,
"rankChange" : 2,
"symbolCode" : "A192820",
"shortCode" : "A192820",
"code" : "KR7192820009",
"name" : "코스맥스",
"isNew" : false,
"tradePrice" : 213500,
"change" : "RISE",
"changePrice" : 8000,
"changeRate" : 0.0389294404,
"signedChangeRate" : 0.0389294404,
"accTradeVolume" : 281843,
"accTradePrice" : 60355787500,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A192820#talks>"
}, {
"rank" : 3,
"rankChange" : -1,
"symbolCode" : "A005930",
"shortCode" : "A005930",
"code" : "KR7005930003",
"name" : "삼성전자",
"isNew" : false,
"tradePrice" : 71250,
"change" : "RISE",
"changePrice" : 750,
"changeRate" : 0.0106382979,
"signedChangeRate" : 0.0106382979,
"accTradeVolume" : 14472170,
"accTradePrice" : 1036072967600,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A005930#talks>"
}, {
"rank" : 4,
"rankChange" : -1,
"symbolCode" : "A000660",
"shortCode" : "A000660",
"code" : "KR7000660001",
"name" : "SK하이닉스",
"isNew" : false,
"tradePrice" : 245500,
"change" : "FALL",
"changePrice" : -10000,
"changeRate" : -0.0391389432,
"signedChangeRate" : -0.0391389432,
"accTradeVolume" : 4709693,
"accTradePrice" : 1165269776250,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A000660#talks>"
}, {
"rank" : 5,
"rankChange" : 0,
"symbolCode" : "A103140",
"shortCode" : "A103140",
"code" : "KR7103140000",
"name" : "풍산",
"isNew" : false,
"tradePrice" : 115900,
"change" : "RISE",
"changePrice" : 1200,
"changeRate" : 0.010462075,
"signedChangeRate" : 0.010462075,
"accTradeVolume" : 169015,
"accTradePrice" : 19846896050,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A103140#talks>"
}, {
"rank" : 6,
"rankChange" : 0,
"symbolCode" : "A000210",
"shortCode" : "A000210",
"code" : "KR7000210005",
"name" : "DL",
"isNew" : false,
"tradePrice" : 38400,
"change" : "RISE",
"changePrice" : 1200,
"changeRate" : 0.0322580645,
"signedChangeRate" : 0.0322580645,
"accTradeVolume" : 114034,
"accTradePrice" : 4391087900,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A000210#talks>"
}, {
"rank" : 7,
"rankChange" : 0,
"symbolCode" : "A035720",
"shortCode" : "A035720",
"code" : "KR7035720002",
"name" : "카카오",
"isNew" : false,
"tradePrice" : 63600,
"change" : "FALL",
"changePrice" : -1700,
"changeRate" : -0.0260336907,
"signedChangeRate" : -0.0260336907,
"accTradeVolume" : 3607494,
"accTradePrice" : 236126079850,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A035720#talks>"
}, {
"rank" : 8,
"rankChange" : 1,
"symbolCode" : "A272210",
"shortCode" : "A272210",
"code" : "KR7272210006",
"name" : "한화시스템",
"isNew" : false,
"tradePrice" : 50800,
"change" : "RISE",
"changePrice" : 1550,
"changeRate" : 0.0314720812,
"signedChangeRate" : 0.0314720812,
"accTradeVolume" : 758969,
"accTradePrice" : 38540105750,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A272210#talks>"
}, {
"rank" : 9,
"rankChange" : 0,
"symbolCode" : "A439260",
"shortCode" : "A439260",
"code" : "KR7439260001",
"name" : "대한조선",
"isNew" : true,
"tradePrice" : 92700,
"change" : "RISE",
"changePrice" : 10200,
"changeRate" : 0.1236363636,
"signedChangeRate" : 0.1236363636,
"accTradeVolume" : 2006478,
"accTradePrice" : 183337929050,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A439260#talks>"
}, {
"rank" : 10,
"rankChange" : 0,
"symbolCode" : "A0010V0",
"shortCode" : "A0010V0",
"code" : "KR70010V0005",
"name" : "제이피아이헬스케어",
"isNew" : true,
"tradePrice" : 23100,
"change" : "RISE",
"changePrice" : 3100,
"changeRate" : 0.155,
"signedChangeRate" : 0.155,
"accTradeVolume" : 13598091,
"accTradePrice" : 372657256050,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A0010V0#talks>"
} ]
}
'''
위 코드에서 응답에 대한 결과가 403에러가 나올 때가 있음;;;;(접근 권한 없음!!)
- 시도할 부분 : user-agent/ referer

# urllib에서는
url = '<https://finance.daum.net/api/search/ranks?limit=10>'
req = urllib.request.Request(
url,
data =None,
# --> 개발자 도구 : 네트워크 --> refer,,user-agent 쪽,,,
headers ={
"refere" : "<https://finance.daum.net/>",
"user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
}
)
res = urllib.request.urlopen(req).read().decode("utf-8")
res
'''
{
"data" : [ {
"rank" : 1,
"rankChange" : 0,
"symbolCode" : "A034020",
"shortCode" : "A034020",
"code" : "KR7034020008",
"name" : "두산에너빌리티",
"isNew" : false,
"tradePrice" : 61800,
"change" : "RISE",
"changePrice" : 4400,
"changeRate" : 0.0766550523,
"signedChangeRate" : 0.0766550523,
"accTradeVolume" : 17110348,
"accTradePrice" : 1043489103400,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A034020#talks>"
}, {
"rank" : 2,
"rankChange" : 1,
"symbolCode" : "A005930",
"shortCode" : "A005930",
"code" : "KR7005930003",
"name" : "삼성전자",
"isNew" : false,
"tradePrice" : 71100,
"change" : "RISE",
"changePrice" : 600,
"changeRate" : 0.0085106383,
"signedChangeRate" : 0.0085106383,
"accTradeVolume" : 14672486,
"accTradePrice" : 1050335945800,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A005930#talks>"
}, {
"rank" : 3,
"rankChange" : 1,
"symbolCode" : "A000660",
"shortCode" : "A000660",
"code" : "KR7000660001",
"name" : "SK하이닉스",
"isNew" : false,
"tradePrice" : 246250,
"change" : "FALL",
"changePrice" : -9250,
"changeRate" : -0.0362035225,
"signedChangeRate" : -0.0362035225,
"accTradeVolume" : 4853038,
"accTradePrice" : 1200494380500,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A000660#talks>"
}, {
"rank" : 4,
"rankChange" : -2,
"symbolCode" : "A192820",
"shortCode" : "A192820",
"code" : "KR7192820009",
"name" : "코스맥스",
"isNew" : false,
"tradePrice" : 213500,
"change" : "RISE",
"changePrice" : 8000,
"changeRate" : 0.0389294404,
"signedChangeRate" : 0.0389294404,
"accTradeVolume" : 285167,
"accTradePrice" : 61066039500,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A192820#talks>"
}, {
"rank" : 5,
"rankChange" : 0,
"symbolCode" : "A103140",
"shortCode" : "A103140",
"code" : "KR7103140000",
"name" : "풍산",
"isNew" : false,
"tradePrice" : 116000,
"change" : "RISE",
"changePrice" : 1300,
"changeRate" : 0.0113339146,
"signedChangeRate" : 0.0113339146,
"accTradeVolume" : 169755,
"accTradePrice" : 19932656750,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A103140#talks>"
}, {
"rank" : 6,
"rankChange" : 0,
"symbolCode" : "A000210",
"shortCode" : "A000210",
"code" : "KR7000210005",
"name" : "DL",
"isNew" : false,
"tradePrice" : 38200,
"change" : "RISE",
"changePrice" : 1000,
"changeRate" : 0.0268817204,
"signedChangeRate" : 0.0268817204,
"accTradeVolume" : 115585,
"accTradePrice" : 4450454950,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A000210#talks>"
}, {
"rank" : 7,
"rankChange" : 2,
"symbolCode" : "A439260",
"shortCode" : "A439260",
"code" : "KR7439260001",
"name" : "대한조선",
"isNew" : false,
"tradePrice" : 92400,
"change" : "RISE",
"changePrice" : 9900,
"changeRate" : 0.12,
"signedChangeRate" : 0.12,
"accTradeVolume" : 2022011,
"accTradePrice" : 184773454800,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A439260#talks>"
}, {
"rank" : 8,
"rankChange" : -1,
"symbolCode" : "A035720",
"shortCode" : "A035720",
"code" : "KR7035720002",
"name" : "카카오",
"isNew" : false,
"tradePrice" : 63600,
"change" : "FALL",
"changePrice" : -1700,
"changeRate" : -0.0260336907,
"signedChangeRate" : -0.0260336907,
"accTradeVolume" : 3635046,
"accTradePrice" : 237878530200,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A035720#talks>"
}, {
"rank" : 9,
"rankChange" : -1,
"symbolCode" : "A272210",
"shortCode" : "A272210",
"code" : "KR7272210006",
"name" : "한화시스템",
"isNew" : false,
"tradePrice" : 50800,
"change" : "RISE",
"changePrice" : 1550,
"changeRate" : 0.0314720812,
"signedChangeRate" : 0.0314720812,
"accTradeVolume" : 770296,
"accTradePrice" : 39115858050,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A272210#talks>"
}, {
"rank" : 10,
"rankChange" : 0,
"symbolCode" : "A201490",
"shortCode" : "A201490",
"code" : "KR7201490000",
"name" : "미투온",
"isNew" : true,
"tradePrice" : 6160,
"change" : "FALL",
"changePrice" : -200,
"changeRate" : -0.0314465409,
"signedChangeRate" : -0.0314465409,
"accTradeVolume" : 7103715,
"accTradePrice" : 44443828500,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A201490#talks>"
} ]
}
'''
import requests
# urllib에서는
url = '<https://finance.daum.net/api/search/ranks?limit=10>'
headers ={
"refere" : "<https://finance.daum.net/>",
"user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
}
res = requests.get(url, headers = headers)
temp = res.text
temp # ==> 받은 정보를 그냥 text로 뽑아내는 역할
'''
{
"data" : [ {
"rank" : 1,
"rankChange" : 0,
"symbolCode" : "A034020",
"shortCode" : "A034020",
"code" : "KR7034020008",
"name" : "두산에너빌리티",
"isNew" : false,
"tradePrice" : 61600,
"change" : "RISE",
"changePrice" : 4200,
"changeRate" : 0.0731707317,
"signedChangeRate" : 0.0731707317,
"accTradeVolume" : 17157796,
"accTradePrice" : 1046414011550,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A034020#talks>"
}, {
"rank" : 2,
"rankChange" : 1,
"symbolCode" : "A005930",
"shortCode" : "A005930",
"code" : "KR7005930003",
"name" : "삼성전자",
"isNew" : false,
"tradePrice" : 71100,
"change" : "RISE",
"changePrice" : 600,
"changeRate" : 0.0085106383,
"signedChangeRate" : 0.0085106383,
"accTradeVolume" : 14698210,
"accTradePrice" : 1052165488800,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A005930#talks>"
}, {
"rank" : 3,
"rankChange" : 1,
"symbolCode" : "A000660",
"shortCode" : "A000660",
"code" : "KR7000660001",
"name" : "SK하이닉스",
"isNew" : false,
"tradePrice" : 245750,
"change" : "FALL",
"changePrice" : -9750,
"changeRate" : -0.0381604697,
"signedChangeRate" : -0.0381604697,
"accTradeVolume" : 4886608,
"accTradePrice" : 1208751824000,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A000660#talks>"
}, {
"rank" : 4,
"rankChange" : -2,
"symbolCode" : "A192820",
"shortCode" : "A192820",
"code" : "KR7192820009",
"name" : "코스맥스",
"isNew" : false,
"tradePrice" : 213500,
"change" : "RISE",
"changePrice" : 8000,
"changeRate" : 0.0389294404,
"signedChangeRate" : 0.0389294404,
"accTradeVolume" : 287520,
"accTradePrice" : 61568542250,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A192820#talks>"
}, {
"rank" : 5,
"rankChange" : 0,
"symbolCode" : "A103140",
"shortCode" : "A103140",
"code" : "KR7103140000",
"name" : "풍산",
"isNew" : false,
"tradePrice" : 115800,
"change" : "RISE",
"changePrice" : 1100,
"changeRate" : 0.0095902354,
"signedChangeRate" : 0.0095902354,
"accTradeVolume" : 170408,
"accTradePrice" : 20008291150,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A103140#talks>"
}, {
"rank" : 6,
"rankChange" : 0,
"symbolCode" : "A000210",
"shortCode" : "A000210",
"code" : "KR7000210005",
"name" : "DL",
"isNew" : false,
"tradePrice" : 38200,
"change" : "RISE",
"changePrice" : 1000,
"changeRate" : 0.0268817204,
"signedChangeRate" : 0.0268817204,
"accTradeVolume" : 116114,
"accTradePrice" : 4470659200,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A000210#talks>"
}, {
"rank" : 7,
"rankChange" : 2,
"symbolCode" : "A439260",
"shortCode" : "A439260",
"code" : "KR7439260001",
"name" : "대한조선",
"isNew" : false,
"tradePrice" : 93700,
"change" : "RISE",
"changePrice" : 11200,
"changeRate" : 0.1357575758,
"signedChangeRate" : 0.1357575758,
"accTradeVolume" : 2060029,
"accTradePrice" : 188327295200,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A439260#talks>"
}, {
"rank" : 8,
"rankChange" : -1,
"symbolCode" : "A035720",
"shortCode" : "A035720",
"code" : "KR7035720002",
"name" : "카카오",
"isNew" : false,
"tradePrice" : 63500,
"change" : "FALL",
"changePrice" : -1800,
"changeRate" : -0.0275650842,
"signedChangeRate" : -0.0275650842,
"accTradeVolume" : 3646183,
"accTradePrice" : 238586074750,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A035720#talks>"
}, {
"rank" : 9,
"rankChange" : -1,
"symbolCode" : "A272210",
"shortCode" : "A272210",
"code" : "KR7272210006",
"name" : "한화시스템",
"isNew" : false,
"tradePrice" : 50900,
"change" : "RISE",
"changePrice" : 1650,
"changeRate" : 0.0335025381,
"signedChangeRate" : 0.0335025381,
"accTradeVolume" : 776885,
"accTradePrice" : 39450920150,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A272210#talks>"
}, {
"rank" : 10,
"rankChange" : 0,
"symbolCode" : "A201490",
"shortCode" : "A201490",
"code" : "KR7201490000",
"name" : "미투온",
"isNew" : true,
"tradePrice" : 6150,
"change" : "FALL",
"changePrice" : -210,
"changeRate" : -0.0330188679,
"signedChangeRate" : -0.0330188679,
"accTradeVolume" : 7117507,
"accTradePrice" : 44528751635,
"chartSlideImage" : null,
"boardUrl" : "<https://finance.daum.net/quotes/A201490#talks>"
} ]
}
'''
temp = res.json() # --> json 패키지를 적용해서,,
temp
'''
{'data': [{'rank': 1,
'rankChange': 0,
'symbolCode': 'A034020',
'shortCode': 'A034020',
'code': 'KR7034020008',
'name': '두산에너빌리티',
'isNew': False,
'tradePrice': 61600,
'change': 'RISE',
'changePrice': 4200,
'changeRate': 0.0731707317,
'signedChangeRate': 0.0731707317,
'accTradeVolume': 17157796,
'accTradePrice': 1046414011550,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A034020#talks>'},
{'rank': 2,
'rankChange': 1,
'symbolCode': 'A005930',
'shortCode': 'A005930',
'code': 'KR7005930003',
'name': '삼성전자',
'isNew': False,
'tradePrice': 71100,
'change': 'RISE',
'changePrice': 600,
'changeRate': 0.0085106383,
'signedChangeRate': 0.0085106383,
'accTradeVolume': 14698210,
'accTradePrice': 1052165488800,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A005930#talks>'},
{'rank': 3,
'rankChange': 1,
'symbolCode': 'A000660',
'shortCode': 'A000660',
'code': 'KR7000660001',
'name': 'SK하이닉스',
'isNew': False,
'tradePrice': 245750,
'change': 'FALL',
'changePrice': -9750,
'changeRate': -0.0381604697,
'signedChangeRate': -0.0381604697,
'accTradeVolume': 4886608,
'accTradePrice': 1208751824000,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A000660#talks>'},
{'rank': 4,
'rankChange': -2,
'symbolCode': 'A192820',
'shortCode': 'A192820',
'code': 'KR7192820009',
'name': '코스맥스',
'isNew': False,
'tradePrice': 213500,
'change': 'RISE',
'changePrice': 8000,
'changeRate': 0.0389294404,
'signedChangeRate': 0.0389294404,
'accTradeVolume': 287520,
'accTradePrice': 61568542250,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A192820#talks>'},
{'rank': 5,
'rankChange': 0,
'symbolCode': 'A103140',
'shortCode': 'A103140',
'code': 'KR7103140000',
'name': '풍산',
'isNew': False,
'tradePrice': 115800,
'change': 'RISE',
'changePrice': 1100,
'changeRate': 0.0095902354,
'signedChangeRate': 0.0095902354,
'accTradeVolume': 170408,
'accTradePrice': 20008291150,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A103140#talks>'},
{'rank': 6,
'rankChange': 0,
'symbolCode': 'A000210',
'shortCode': 'A000210',
'code': 'KR7000210005',
'name': 'DL',
'isNew': False,
'tradePrice': 38200,
'change': 'RISE',
'changePrice': 1000,
'changeRate': 0.0268817204,
'signedChangeRate': 0.0268817204,
'accTradeVolume': 116114,
'accTradePrice': 4470659200,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A000210#talks>'},
{'rank': 7,
'rankChange': 2,
'symbolCode': 'A439260',
'shortCode': 'A439260',
'code': 'KR7439260001',
'name': '대한조선',
'isNew': False,
'tradePrice': 93700,
'change': 'RISE',
'changePrice': 11200,
'changeRate': 0.1357575758,
'signedChangeRate': 0.1357575758,
'accTradeVolume': 2060029,
'accTradePrice': 188327295200,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A439260#talks>'},
{'rank': 8,
'rankChange': -1,
'symbolCode': 'A035720',
'shortCode': 'A035720',
'code': 'KR7035720002',
'name': '카카오',
'isNew': False,
'tradePrice': 63500,
'change': 'FALL',
'changePrice': -1800,
'changeRate': -0.0275650842,
'signedChangeRate': -0.0275650842,
'accTradeVolume': 3646183,
'accTradePrice': 238586074750,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A035720#talks>'},
{'rank': 9,
'rankChange': -1,
'symbolCode': 'A272210',
'shortCode': 'A272210',
'code': 'KR7272210006',
'name': '한화시스템',
'isNew': False,
'tradePrice': 50900,
'change': 'RISE',
'changePrice': 1650,
'changeRate': 0.0335025381,
'signedChangeRate': 0.0335025381,
'accTradeVolume': 776885,
'accTradePrice': 39450920150,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A272210#talks>'},
{'rank': 10,
'rankChange': 0,
'symbolCode': 'A201490',
'shortCode': 'A201490',
'code': 'KR7201490000',
'name': '미투온',
'isNew': True,
'tradePrice': 6150,
'change': 'FALL',
'changePrice': -210,
'changeRate': -0.0330188679,
'signedChangeRate': -0.0330188679,
'accTradeVolume': 7117507,
'accTradePrice': 44528751635,
'chartSlideImage': None,
'boardUrl': '<https://finance.daum.net/quotes/A201490#talks>'}]}
'''
# 순위, 종목, 현재 가격 10개 출력해보자!!
for i in temp["data"]:
print(i["rank"],i["name"],i["tradePrice"])
'''
1 두산에너빌리티 61600
2 삼성전자 71100
3 SK하이닉스 245750
4 코스맥스 213500
5 풍산 115800
6 DL 38200
7 대한조선 93700
8 카카오 63500
9 한화시스템 50900
10 미투온 6150
'''
업종 상위 하위


url = '<https://finance.daum.net/api/sector/wics?perPage=5&order=desc>'
res = urllib.request.urlopen(url)
res.read().decode("utf-8")
'''
HTTPError: HTTP Error 403:
'''
# urllib에서는
url = '<https://finance.daum.net/api/sector/wics?perPage=5&order=desc>'
headers ={
"referer" : "<https://finance.daum.net/>",
"user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
}
res = requests.get( url, headers=headers)
temp = res.text
temp # ==> 받은 정보를 그냥 text로 뽑아내는 역할
'''
{"code":200,"message":"OK","data":[{"accTradeVolume":1197570,"accTradePrice":52238017347.000,"change":"RISE","sectorCode":"G404020","sectorName":"생명보험","changeRate":0.0578974884,"stockCount":5,"includedStocks":[{"code":"KR7032830002","symbolCode":"A032830","name":"삼성생명","change":"RISE","changeRate":0.0685670262,"tradePrice":138700.000,"changePrice":8900.000,"accTradeVolume":362439,"accTradePrice":49013557000.000,"marketCap":27740000000000,"foreignRatio":0.219101865},{"code":"KR7085620003","symbolCode":"A085620","name":"미래에셋생명","change":"RISE","changeRate":0.0112359551,"tradePrice":7200.000,"changePrice":80.000,"accTradeVolume":50253,"accTradePrice":363754775.000,"marketCap":1274516560800,"foreignRatio":0.0120385769}]},{"accTradeVolume":31919740,"accTradePrice":17772990584.000,"change":"RISE","sectorCode":"G151060","sectorName":"종이와목재","changeRate":0.0467818863,"stockCount":14,"includedStocks":[{"code":"KR7078130002","symbolCode":"A078130","name":"국일제지","change":"RISE","changeRate":0.1545064378,"tradePrice":538.000,"changePrice":72.000,"accTradeVolume":31559888,"accTradePrice":17038246223.000,"marketCap":606544358598,"foreignRatio":0.0029136384},{"code":"KR7002820009","symbolCode":"A002820","name":"SUN&L","change":"RISE","changeRate":0.0184162063,"tradePrice":2765.000,"changePrice":50.000,"accTradeVolume":4317,"accTradePrice":11998280.000,"marketCap":34861089585,"foreignRatio":0.0078267835}]},{"accTradeVolume":22024,"accTradePrice":1707194150.000,"change":"RISE","sectorCode":"G551030","sectorName":"복합유틸리티","changeRate":0.0427807487,"stockCount":1,"includedStocks":[{"code":"KR7071320006","symbolCode":"A071320","name":"지역난방공사","change":"RISE","changeRate":0.0427807487,"tradePrice":78000.000,"changePrice":3200.000,"accTradeVolume":22024,"accTradePrice":1707194150.000,"marketCap":903142032000,"foreignRatio":0.0478498359}]},{"accTradeVolume":7340962,"accTradePrice":399558557275.000,"change":"RISE","sectorCode":"G551010","sectorName":"전기유틸리티","changeRate":0.039175649,"stockCount":5,"includedStocks":[{"code":"KR7052690005","symbolCode":"A052690","name":"한전기술","change":"RISE","changeRate":0.1425287356,"tradePrice":99400.000,"changePrice":12400.000,"accTradeVolume":2123213,"accTradePrice":210738703300.000,"marketCap":3799068000000,"foreignRatio":0.1074997645},{"code":"KR7051600005","symbolCode":"A051600","name":"한전KPS","change":"RISE","changeRate":0.0502564103,"tradePrice":51200.000,"changePrice":2450.000,"accTradeVolume":408096,"accTradePrice":20876683825.000,"marketCap":2304000000000,"foreignRatio":0.1199900667}]},{"accTradeVolume":20073778,"accTradePrice":797398015366.000,"change":"RISE","sectorCode":"G201065","sectorName":"조선","changeRate":0.0336567967,"stockCount":30,"includedStocks":[{"code":"KR7439260001","symbolCode":"A439260","name":"대한조선","change":"RISE","changeRate":0.143030303,"tradePrice":94300.000,"changePrice":11800.000,"accTradeVolume":2137716,"accTradePrice":195635167650.000,"marketCap":3633031221600,"foreignRatio":0.0041390933},{"code":"KR7101000008","symbolCode":"A101000","name":"KS인더스트리","change":"RISE","changeRate":0.0775862069,"tradePrice":1875.000,"changePrice":135.000,"accTradeVolume":1728460,"accTradePrice":3170508374.000,"marketCap":62712753750,"foreignRatio":0.0142981682}]}],"totalPages":16,"totalCount":78,"currentPage":1,"pageSize":5}
'''
temp = res.json()
temp
'''
{'code': 200,
'message': 'OK',
'data': [{'accTradeVolume': 1197570,
'accTradePrice': 52238017347.0,
'change': 'RISE',
'sectorCode': 'G404020',
'sectorName': '생명보험',
'changeRate': 0.0578974884,
'stockCount': 5,
'includedStocks': [{'code': 'KR7032830002',
'symbolCode': 'A032830',
'name': '삼성생명',
'change': 'RISE',
'changeRate': 0.0685670262,
'tradePrice': 138700.0,
'changePrice': 8900.0,
'accTradeVolume': 362439,
'accTradePrice': 49013557000.0,
'marketCap': 27740000000000,
'foreignRatio': 0.219101865},
{'code': 'KR7085620003',
'symbolCode': 'A085620',
'name': '미래에셋생명',
'change': 'RISE',
'changeRate': 0.0112359551,
'tradePrice': 7200.0,
'changePrice': 80.0,
'accTradeVolume': 50253,
'accTradePrice': 363754775.0,
'marketCap': 1274516560800,
'foreignRatio': 0.0120385769}]},
{'accTradeVolume': 31919740,
'accTradePrice': 17772990584.0,
'change': 'RISE',
'sectorCode': 'G151060',
'sectorName': '종이와목재',
'changeRate': 0.0467818863,
'stockCount': 14,
'includedStocks': [{'code': 'KR7078130002',
'symbolCode': 'A078130',
'name': '국일제지',
'change': 'RISE',
'changeRate': 0.1545064378,
'tradePrice': 538.0,
'changePrice': 72.0,
'accTradeVolume': 31559888,
'accTradePrice': 17038246223.0,
'marketCap': 606544358598,
'foreignRatio': 0.0029136384},
{'code': 'KR7002820009',
'symbolCode': 'A002820',
'name': 'SUN&L',
'change': 'RISE',
'changeRate': 0.0184162063,
'tradePrice': 2765.0,
'changePrice': 50.0,
'accTradeVolume': 4317,
'accTradePrice': 11998280.0,
'marketCap': 34861089585,
'foreignRatio': 0.0078267835}]},
{'accTradeVolume': 22024,
'accTradePrice': 1707194150.0,
'change': 'RISE',
'sectorCode': 'G551030',
'sectorName': '복합유틸리티',
'changeRate': 0.0427807487,
'stockCount': 1,
'includedStocks': [{'code': 'KR7071320006',
'symbolCode': 'A071320',
'name': '지역난방공사',
'change': 'RISE',
'changeRate': 0.0427807487,
'tradePrice': 78000.0,
'changePrice': 3200.0,
'accTradeVolume': 22024,
'accTradePrice': 1707194150.0,
'marketCap': 903142032000,
'foreignRatio': 0.0478498359}]},
{'accTradeVolume': 7340962,
'accTradePrice': 399558557275.0,
'change': 'RISE',
'sectorCode': 'G551010',
'sectorName': '전기유틸리티',
'changeRate': 0.039175649,
'stockCount': 5,
'includedStocks': [{'code': 'KR7052690005',
'symbolCode': 'A052690',
'name': '한전기술',
'change': 'RISE',
'changeRate': 0.1425287356,
'tradePrice': 99400.0,
'changePrice': 12400.0,
'accTradeVolume': 2123213,
'accTradePrice': 210738703300.0,
'marketCap': 3799068000000,
'foreignRatio': 0.1074997645},
{'code': 'KR7051600005',
'symbolCode': 'A051600',
'name': '한전KPS',
'change': 'RISE',
'changeRate': 0.0502564103,
'tradePrice': 51200.0,
'changePrice': 2450.0,
'accTradeVolume': 408096,
'accTradePrice': 20876683825.0,
'marketCap': 2304000000000,
'foreignRatio': 0.1199900667}]},
{'accTradeVolume': 20073778,
'accTradePrice': 797398015366.0,
'change': 'RISE',
'sectorCode': 'G201065',
'sectorName': '조선',
'changeRate': 0.0336567967,
'stockCount': 30,
'includedStocks': [{'code': 'KR7439260001',
'symbolCode': 'A439260',
'name': '대한조선',
'change': 'RISE',
'changeRate': 0.143030303,
'tradePrice': 94300.0,
'changePrice': 11800.0,
'accTradeVolume': 2137716,
'accTradePrice': 195635167650.0,
'marketCap': 3633031221600,
'foreignRatio': 0.0041390933},
{'code': 'KR7101000008',
'symbolCode': 'A101000',
'name': 'KS인더스트리',
'change': 'RISE',
'changeRate': 0.0775862069,
'tradePrice': 1875.0,
'changePrice': 135.0,
'accTradeVolume': 1728460,
'accTradePrice': 3170508374.0,
'marketCap': 62712753750,
'foreignRatio': 0.0142981682}]}],
'totalPages': 16,
'totalCount': 78,
'currentPage': 1,
'pageSize': 5}
'''
내가 프로젝트 할 데이터 수집할 사이트 특징에 따라 방법 달라짐
- 일반 사이트에서도 난도가 각양각색
- 해보면서 해결책을 찾는 게 답이다
-
- 난도가 높은 사이트는 전문 업체/툴을 사용해야하는 경우도 있음
'데이터분석 > Pandas' 카테고리의 다른 글
| [Python] Pandas 11 _ pandas_m&a (5) | 2025.08.21 |
|---|---|
| [Python] Pandas 10 _ csv (0) | 2025.08.21 |
| [Python] Pandas 08 _ dart_site (5) | 2025.08.21 |
| [Python] Pandas 07 _ json_kobis_api (2) | 2025.08.20 |
| [Python] Pandas 06 _ kobis_api_xml (0) | 2025.08.20 |