728x90

네이버 증권(finance.naver.com)은 주식 시세, 뉴스, 배당 정보 등 다양한 금융 데이터를 제공하는 플랫폼으로, JavaScript로 동적 렌더링되는 페이지가 많아 Playwright와 같은 브라우저 자동화 도구가 크롤링에 적합합니다. Playwright는 동적 웹페이지 처리, 자동 대기, 크로스 브라우저 지원 등으로 네이버 증권의 데이터를 효과적으로 수집할 수 있습니다. 아래는 Playwright를 사용한 네이버 증권 크롤링 예제를 Python으로 작성한 내용입니다.
주의: 네이버 증권 크롤링 시 robots.txt와 이용 약관을 확인하고, 과도한 요청으로 서버에 부담을 주지 않도록 적절한 딜레이를 설정하세요. 상업적 사용은 약관 위반이 될 수 있으니 개인 학습 목적으로만 사용하세요.
설치
Playwright와 필요한 패키지를 설치합니다:
pip install playwright
playwright install
예제 1: 특정 종목의 주식 시세 크롤링
네이버 증권에서 특정 종목(예: 삼성전자, 종목코드 005930)의 현재 주가, 시가, 고가, 저가, 거래량을 크롤링합니다.
from playwright.sync_api import sync_playwright
import json
import time
def crawl_stock_price():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 디버깅을 위해 headless=False
page = browser.new_page()
# 네이버 증권 삼성전자 페이지로 이동
stock_code = "005930" # 삼성전자
url = f"https://finance.naver.com/item/main.naver?code={stock_code}"
page.goto(url)
# 데이터 로드 대기
page.wait_for_selector('div.rate_info')
# 주식 데이터 추출
stock_data = {
'name': page.query_selector('h2 a').inner_text(), # 종목명
'current_price': page.query_selector('p.no_today span.blind').inner_text(), # 현재가
'open_price': page.query_selector('td.first span.blind').inner_text(), # 시가
'high_price': page.query_selector('td em:nth-child(1) span.blind').inner_text(), # 고가
'low_price': page.query_selector('td em:nth-child(2) span.blind').inner_text(), # 저가
'volume': page.query_selector('tr:nth-child(2) td span.blind').inner_text() # 거래량
}
# 결과 출력 및 JSON 저장
print("주식 데이터:", stock_data)
with open('stock_price.json', 'w', encoding='utf-8') as f:
json.dump(stock_data, f, ensure_ascii=False, indent=2)
browser.close()
if __name__ == "__main__":
crawl_stock_price()
설명:
- URL: 종목코드(예: 005930)를 포함한 네이버 증권 페이지로 이동.
- 셀렉터: 개발자 도구(F12)로 확인한 CSS 셀렉터를 사용해 데이터 추출.
- 데이터: 종목명, 현재가, 시가, 고가, 저가, 거래량을 JSON으로 저장.
- 주의: 네이버 증권의 페이지 구조가 변경될 수 있으므로, 셀렉터는 주기적으로 확인 필요.
728x90
예제 2: 네이버 증권 뉴스 크롤링 (비동기 처리)
네이버 증권의 뉴스 섹션에서 특정 종목 관련 최신 뉴스 제목과 링크를 크롤링합니다. 비동기(async) 방식으로 성능을 최적화하고, 세마포어를 사용해 IP 차단을 방지합니다.
import asyncio
from playwright.async_api import async_playwright
import json
async def crawl_stock_news():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.new_context()
page = await context.new_page()
# 네이버 증권 삼성전자 뉴스 페이지로 이동
stock_code = "005930" # 삼성전자
url = f"https://finance.naver.com/item/news.naver?code={stock_code}"
await page.goto(url, timeout=10000)
# 뉴스 목록 로드 대기
await page.wait_for_selector('table.type5')
# 뉴스 데이터 추출
news_items = []
rows = await page.query_selector_all('table.type5 tbody tr')
for row in rows[:10]: # 상위 10개 뉴스만 추출
title_elem = await row.query_selector('td.title a')
date_elem = await row.query_selector('td.date')
if title_elem and date_elem:
title = await title_elem.inner_text()
link = await title_elem.get_attribute('href')
date = await date_elem.inner_text()
news_items.append({
'title': title.strip(),
'link': f"https://finance.naver.com{link}",
'date': date.strip()
})
# 결과 출력 및 JSON 저장
print(f"총 {len(news_items)}개의 뉴스 수집")
for news in news_items:
print(news)
with open('stock_news.json', 'w', encoding='utf-8') as f:
json.dump(news_items, f, ensure_ascii=False, indent=2)
await context.close()
await browser.close()
if __name__ == "__main__":
asyncio.run(crawl_stock_news())
설명:
- 비동기 처리:
async_playwright를 사용해 비동기적으로 실행, 성능 최적화. - 뉴스 데이터: 뉴스 제목, 링크, 날짜를 수집해 JSON으로 저장.
- IP 차단 방지:
timeout=10000으로 요청 속도 제한, 세마포어 추가 가능(예:asyncio.Semaphore(8)). - 참고: 네이버의 IP 차단 정책을 고려해
time.sleep(1)또는 세마포어로 요청 간격 조절 추천.
728x90
예제 3: 코스피 종목 목록 크롤링
네이버 증권에서 코스피 상위 종목의 이름과 종목코드를 크롤링합니다.
from playwright.sync_api import sync_playwright
import json
def crawl_kospi_stocks():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 네이버 증권 코스피 페이지로 이동
page.goto('https://finance.naver.com/sise/sise_market_sum.naver?sosok=0')
# 종목 목록 로드 대기
page.wait_for_selector('table.type_2')
# 종목 데이터 추출
stocks = []
rows = page.query_selector_all('table.type_2 tbody tr')
for row in rows:
name_elem = row.query_selector('td:nth-child(2) a')
code_elem = row.query_selector('td:nth-child(2) a')
if name_elem and code_elem:
name = name_elem.inner_text()
code = code_elem.get_attribute('href').split('code=')[1]
stocks.append({
'name': name,
'code': code
})
# 결과 출력 및 JSON 저장
print(f"총 {len(stocks)}개의 코스피 종목 수집")
for stock in stocks:
print(stock)
with open('kospi_stocks.json', 'w', encoding='utf-8') as f:
json.dump(stocks, f, ensure_ascii=False, indent=2)
browser.close()
if __name__ == "__main__":
crawl_kospi_stocks()
설명:
- 대상 페이지: 네이버 증권의 코스피 시가총액 순위 페이지.
- 데이터: 종목명과 종목코드를 추출해 JSON으로 저장.
- 페이지네이션: 여러 페이지를 크롤링하려면
page.click('a.pgRR')로 다음 페이지 이동 추가 가능.
추가 팁
- IP 차단 방지: 네이버는 과도한 요청 시 IP 차단 가능성 있음.
asyncio.Semaphore또는time.sleep(1)으로 요청 속도 조절. - 셀렉터 업데이트: 네이버 증권의 HTML 구조가 변경될 수 있으므로, 개발자 도구로 셀렉터 확인 필요.
- 비동기 최적화: 대량 데이터 크롤링 시
async_playwright와asyncio.gather로 병렬 처리. - User-Agent 설정: 봇 탐지 회피를 위해
context = browser.new_context(user_agent='Mozilla/5.0 ...')추가 가능. - 디버깅:
page.screenshot(path='debug.png')로 페이지 상태 확인. - 대체 도구: 정적 데이터는
requests와BeautifulSoup으로도 수집 가능하나, 동적 페이지에는 Playwright가 더 적합.
Playwright의 장점 (네이버 증권 크롤링 관점)
- 동적 페이지 처리: JavaScript 렌더링된 네이버 증권 페이지에서 안정적 데이터 추출.
- 자동 대기:
wait_for_selector로 요소 로드 대기, 플레이크 테스트 감소. - 비동기 지원:
asyncAPI로 대량 크롤링 속도 향상. - 크로스 브라우저: Chromium, Firefox, WebKit 지원으로 다양한 환경 테스트 가능.
이 예제들은 네이버 증권의 주식 시세, 뉴스, 종목 목록을 크롤링하는 방법을 다룹니다. 특정 종목이나 다른 데이터(예: 재무제표, 공시)를 추가로 크롤링하고 싶다면 말씀해주세요
728x90
'Python을 배워보자' 카테고리의 다른 글
| 파이썬으로 웹 콘텐츠 자동 추출하고 이메일 보내기: 간단한 스크립트 튜토리얼 (0) | 2025.10.11 |
|---|---|
| 박스오피스예매율실시간 크롤링 (0) | 2025.09.23 |
| Playwright: 현대적인 웹 테스트 자동화의 강자 (3) | 2025.07.26 |
| 국가별 월별 기온 데이터를 FastAPI로 백엔드 구축 및 Dash로 테이블 출력하기 (3) | 2025.07.24 |
| 영화진흥위원회(KOBIS) 오픈 API를 사용해 일별 박스오피스 데이터를 가져오는 Python 샘플 코드 (4) | 2025.07.22 |