이 가이드에서는 요청과 lxml 라이브러리를 사용해 Python을 사용해 Yahoo Finance에서 데이터를 스크랩하는 방법을 설명합니다. 야후 파이낸스는 실시간 시장 분석, 재무 모델링, 자동화된 투자 전략 수립에 핵심적인 주가 및 시장 동향과 같은 광범위한 금융 데이터를 제공합니다.
이 절차는 웹페이지 콘텐츠를 검색하기 위해 HTTP 요청을 전송하고, 수신된 HTML을 파싱하고, XPath 표현식을 사용해 특정 데이터를 추출하는 과정을 거칩니다. 이 접근 방식은 효율적이고 타겟팅된 데이터 추출을 가능하게 하여 사용자가 동적으로 재무 정보에 액세스하고 활용할 수 있도록 합니다.
다음 Python 라이브러리를 사용합니다:
시작하기 전에 이러한 라이브러리가 설치되어 있는지 확인하세요:
pip install requests
pip install lxml
아래에서는 명확하고 이해하기 쉽도록 코드 예제와 함께 구문 분석 프로세스를 단계별로 살펴보겠습니다.
웹 스크래핑의 첫 번째 단계는 대상 URL에 HTTP 요청을 보내는 것입니다. 이를 위해 요청 라이브러리를 사용합니다. 요청에 적절한 헤더를 포함시켜 실제 브라우저를 모방하는 것이 중요하며, 이는 기본적인 봇 방지 조치를 우회하는 데 도움이 됩니다.
import requests
from lxml import html
# 타겟 URL
url = "https://finance.yahoo.com/quote/AMZN/"
# 실제 브라우저를 모방하는 헤더
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
# HTTP 요청 보내기
response = requests.get(url, headers=headers)
HTML 콘텐츠를 받은 후 다음 단계는 XPath를 사용하여 원하는 데이터를 추출하는 것입니다. XPath는 XML 문서에서 노드를 선택하기 위한 강력한 쿼리 언어로, HTML 콘텐츠를 구문 분석하는 데 적합합니다.
제목 및 가격:
자세한 내용:
다음은 다양한 재무 데이터를 추출하는 데 사용할 XPath 표현식입니다:
# HTML 콘텐츠 구문 분석
parser = html.fromstring(response.content)
# XPath를 사용하여 데이터 추출
title = ' '.join(parser.xpath('//h1[@class="yf-3a2v0c"]/text()'))
live_price = parser.xpath('//fin-streamer[@class="livePrice yf-mgkamr"]/span/text()')[0]
date_time = parser.xpath('//div[@slot="marketTimeNotice"]/span/text()')[0]
open_price = parser.xpath('//ul[@class="yf-tx3nkj"]/li[2]/span[2]/fin-streamer/text()')[0]
previous_close = parser.xpath('//ul[@class="yf-tx3nkj"]/li[1]/span[2]/fin-streamer/text()')[0]
days_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[5]/span[2]/fin-streamer/text()')[0]
week_52_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[6]/span[2]/fin-streamer/text()')[0]
volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[7]/span[2]/fin-streamer/text()')[0]
avg_volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[8]/span[2]/fin-streamer/text()')[0]
# 추출된 데이터 인쇄
print(f"Title: {title}")
print(f"Live Price: {live_price}")
print(f"Date & Time: {date_time}")
print(f"Open Price: {open_price}")
print(f"Previous Close: {previous_close}")
print(f"Day's Range: {days_range}")
print(f"52 Week Range: {week_52_range}")
print(f"Volume: {volume}")
print(f"Avg. Volume: {avg_volume}")
야후 파이낸스와 같은 웹사이트는 자동 스크래핑을 방지하기 위해 봇 방지 조치를 사용하는 경우가 많습니다. 차단을 피하려면 프록시를 사용하고 헤더를 회전할 수 있습니다.
프록시 서버는 내 컴퓨터와 대상 웹사이트 사이의 중개자 역할을 합니다. 프록시 서버는 사용자의 IP 주소를 마스킹하여 웹사이트가 스크래핑을 감지하기 어렵게 만듭니다.
# IP 권한 부여 모델과 프록시 사용 예시
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
사용자-에이전트 헤더를 회전하는 것도 탐지를 피하는 또 다른 효과적인 방법입니다. 일반적인 사용자 에이전트 문자열 목록을 사용하여 각 요청에 대해 무작위로 하나를 선택할 수 있습니다.
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
# 여기에 사용자 에이전트 문자열을 더 추가하세요.
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
마지막으로 스크랩한 데이터를 나중에 사용할 수 있도록 CSV 파일에 저장할 수 있습니다. 이 기능은 대용량 데이터 세트를 저장하거나 오프라인에서 데이터를 분석할 때 특히 유용합니다.
import csv
# 저장할 데이터
data = [
["URL", "Title", "Live Price", "Date & Time", "Open Price", "Previous Close", "Day's Range", "52 Week Range", "Volume", "Avg. Volume"],
[url, title, live_price, date_time, open_price, previous_close, days_range, week_52_range, volume, avg_volume]
]
# CSV 파일로 저장
with open("yahoo_finance_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("Data saved to yahoo_finance_data.csv")
아래는 지금까지 설명한 모든 단계를 통합한 전체 Python 스크립트입니다. 여기에는 헤더를 포함한 요청 전송, 프록시 사용, XPath로 데이터 추출, 데이터를 CSV 파일에 저장하는 작업이 포함됩니다.
import requests
from lxml import html
import random
import csv
# 스크랩할 URL 예시
url = "https://finance.yahoo.com/quote/AMZN/"
# 헤더 회전용 사용자-에이전트 문자열 목록
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
# Add more User-Agent strings here
]
# 실제 브라우저를 모방하는 헤더
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'User-agent': random.choice(user_agents),
}
# 프록시 사용 예시
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# 헤더 및 선택적 프록시와 함께 HTTP 요청을 전송합니다.
response = requests.get(url, headers=headers, proxies=proxies)
# 요청이 성공했는지 확인
if response.status_code == 200:
# HTML 콘텐츠 구문 분석
parser = html.fromstring(response.content)
# XPath를 사용하여 데이터 추출
title = ' '.join(parser.xpath('//h1[@class="yf-3a2v0c"]/text()'))
live_price = parser.xpath('//fin-streamer[@class="livePrice yf-mgkamr"]/span/text()')[0]
date_time = parser.xpath('//div[@slot="marketTimeNotice"]/span/text()')[0]
open_price = parser.xpath('//ul[@class="yf-tx3nkj"]/li[2]/span[2]/fin-streamer/text()')[0]
previous_close = parser.xpath('//ul[@class="yf-tx3nkj"]/li[1]/span[2]/fin-streamer/text()')[0]
days_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[5]/span[2]/fin-streamer/text()')[0]
week_52_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[6]/span[2]/fin-streamer/text()')[0]
volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[7]/span[2]/fin-streamer/text()')[0]
avg_volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[8]/span[2]/fin-streamer/text()')[0]
# 추출된 데이터 인쇄
print(f"Title: {title}")
print(f"Live Price: {live_price}")
print(f"Date & Time: {date_time}")
print(f"Open Price: {open_price}")
print(f"Previous Close: {previous_close}")
print(f"Day's Range: {days_range}")
print(f"52 Week Range: {week_52_range}")
print(f"Volume: {volume}")
print(f"Avg. Volume: {avg_volume}")
# 데이터를 CSV 파일로 저장
data = [
["URL", "Title", "Live Price", "Date & Time", "Open Price", "Previous Close", "Day's Range", "52 Week Range", "Volume", "Avg. Volume"],
[url, title, live_price, date_time, open_price, previous_close, days_range, week_52_range, volume, avg_volume]
]
with open("yahoo_finance_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("Data saved to yahoo_finance_data.csv")
else:
print(f"Failed to retrieve data. Status code: {response.status_code}")
Python을 사용해 Yahoo Finance 데이터를 스크래핑하는 것은 금융 데이터 수집을 자동화하는 강력한 방법입니다. 적절한 헤더, 프록시 및 봇 방지 조치와 함께 요청 및 lxml 라이브러리를 사용하면 분석을 위해 주식 데이터를 효율적으로 스크랩하고 저장할 수 있습니다. 이 가이드에서는 기본적인 사항을 다루었지만, 웹사이트를 스크랩할 때는 법적 및 윤리적 가이드라인을 준수해야 한다는 점을 잊지 마세요.
댓글: 0