파이썬으로 Google 재무 데이터를 스크랩하는 방법

댓글: 0

오늘날의 투자자와 애널리스트는 최신의 정확한 정보를 제공하기 때문에 Google 재무 정보를 사용하고 있습니다. 특히 지수 및 시장 동향과 함께 주식에 대한 모든 유형의 최신 재무 데이터, 기업의 재무 지표에 대한 자세한 정보를 제공하는 Google Finance가 가장 선호되는 것으로 보입니다. Python은 웹 스크래핑에 가장 적합한 언어입니다. 이 포스팅에서는 필요한 모든 재무 분석 도구를 갖출 수 있도록 Google 재무에서 데이터를 수집하는 방법을 배워보겠습니다.

필요한 라이브러리 설치하기

시작하기 전에 시스템에 Python이 설치되어 있는지 확인하세요. 또한 HTTP 요청을 하기 위한 요청과 웹 페이지의 HTML 콘텐츠를 구문 분석하기 위한 lxml 라이브러리가 필요합니다. 필요한 라이브러리를 설치하려면 명령줄에서 다음 명령을 사용합니다:

pip install requests
pip install lxml

다음으로 Google 재무에서 데이터를 추출하는 단계별 프로세스를 살펴보겠습니다:

1단계: HTML 구조 이해

Google Finance에서 데이터를 스크랩하려면 관심 있는 정보가 포함된 특정 HTML 요소를 식별해야 합니다:

  • 제목: 위치 //div[@class="zzDege"]/text()
  • 가격: 다음에서 확인 가능 //div[@class="YMlKec fxKbKc"]/text()
  • 날짜: 위치 //div[@class="ygUjEc"]/text()

이러한 XPath 표현식은 Google 재무 페이지의 HTML 구조에서 관련 데이터를 탐색하고 추출하기 위한 가이드 역할을 합니다.

제목:

1.png

가격:

2.png

날짜:

3.png

2 단계 : 스크레이퍼 함수 설정

스크레이퍼를 설정할 때 효율적이고 안전한 데이터 수집을 보장하기 위해 몇 가지 중요한 측면에 집중하는 것이 중요합니다.

http 요청

Google Finance 웹 사이트에서 HTML 컨텐츠를 가져 오려면 요청 라이브러리를 사용하겠습니다. 이 단계는 데이터를 추출하려는 웹 페이지를로드하여 프로세스를 시작합니다.

스크래핑에서 올바른 헤더를 사용하는 것의 중요성

웹 스크래핑, 특히 사용자 에이전트 헤더가 올바른 헤더를 사용하는 것이 정말 중요합니다. 헤더 사용은 사이트가 자동 스크립트를 식별하고 중지하지 못하게하는 진정한 브라우저 요청을 시뮬레이션하는 데 필수적입니다. 요청에 대한 관련 정보를 제공하여 서버가 올바르게 응답해야합니다. 적절한 헤더가 없으면 요청이 거부되거나 서버가 완전히 다른 컨텐츠를 반환하거나 웹 스크래핑 활동을 제한 할 수있는 부분에서 콘텐츠를 전달할 수 있습니다. 따라서 헤더를 적절하게 설정하면 웹 사이트에 대한 액세스를 유지하는 데 도움이되고 스크레이퍼가 올바른 데이터를 검색 할 수 있습니다.

import requests

# 헤더 정의 브라우저 방문을 모방하고 서버에서 차단되지 않도록합니다.
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="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    '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/126.0.0.0 Safari/537.36',
}

# 유로넥스트 파리(EPA) 거래소에서 BNP 파리바(티커 BNP)에 대한 Google 파이낸스 페이지의 URL을 정의합니다.
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"

# 지정된 헤더를 사용하여 URL에 HTTP GET 요청을 보냅니다.
response = requests.get(url, headers=headers)

프록시 사용의 중요성

Google 파이낸스나 대규모 웹사이트를 스크랩할 때는 프록시를 사용하는 것이 중요합니다. 그 이유는 다음과 같습니다:

  • IP 금지 방지: Google Finance와 같은 웹사이트는 단기간에 너무 많은 요청을 하는 IP 주소의 액세스를 차단하거나 제한하는 경우가 많습니다. 프록시는 여러 IP 주소로 요청을 분산하여 탐지 및 차단 가능성을 줄여줍니다.
  • 개인정보 보호 강화: 프록시를 사용하면 익명성 계층이 추가되어 데이터를 스크랩하는 동안 사용자의 신원과 의도를 보호할 수 있습니다.
# 프록시 설정 정의
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# 지정된 헤더와 프록시를 사용하여 URL에 HTTP GET 요청을 보냅니다.
response = requests.get(url, headers=headers, proxies=proxies)

lxml로 HTML 구문 분석하기

HTML 콘텐츠를 가져온 후에는 lxml 라이브러리를 사용하여 구문 분석해야 합니다. 이렇게 하면 HTML 구조를 탐색하고 필요한 데이터를 추출할 수 있습니다:

HTML 콘텐츠를 Element 객체로 구문 분석하기 위해 lxml.html의 fromstring 함수를 가져옵니다. fromstring 메서드는 앞서 가져온 웹 페이지의 원시 HTML인 response.text를 구문 분석하고 구문 분석된 HTML 트리의 루트를 나타내는 파서 변수에 저장된 엘리먼트 객체를 반환합니다.

from lxml.html import fromstring

# lxml의 fromstring 메서드를 사용하여 응답의 HTML 콘텐츠를 구문 분석합니다.
parser = fromstring(response.text)

XPath로 데이터 추출하기

이제 파싱된 HTML 트리에서 XPath 표현식을 사용하여 특정 데이터를 추출해 보겠습니다:

title은 구문 분석된 HTML에서 금융 상품의 제목을 검색합니다. 가격은 현재 주가를 검색합니다. 날짜는 날짜를 검색합니다. finance_data 사전에는 추출된 제목, 가격, 날짜가 포함됩니다. 이 사전은 목록에 추가됩니다.

# 출력 데이터를 저장하려면 목록
finance_data_list = []

# 금융 상품의 제목을 추출합니다
title = parser.xpath('//div[@class="zzDege"]/text()')[0]

# 주식의 현재 가격을 추출합니다
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]

# 날짜 추출
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]

# 추출 된 데이터를 저장하기위한 사전 생성
finance_data = {
    'title': title,
    'price': price,
    'date': date
}
# Finance_Data_List에 데이터를 추가합니다
finance_data_list.append(finance_data)

데이터 처리 및 스토리지

긁힌 데이터를 처리하려면 추가 처리하거나 JSON과 같은 구조적 형식으로 저장할 수 있습니다.

output_file 변수는 데이터가 저장 될 JSON 파일의 이름을 지정합니다 (Finance_Data.json). Open (output_file, 'w')은 쓰기 모드에서 파일을 엽니 다. 그리고 json.dump (Finance_data_list, f, Indent = 4)는 재정 _data_list를 4 공간 인수가 적용 할 수 있도록 파일에 씁니다.

# Finance_Data_List를 JSON 파일로 저장하십시오
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

처리 요청 예외

웹 사이트에서 데이터를 폐기하는 동안 스크래핑 스크립트의 신뢰성과 견고성을 보장하기 위해 요청 예외를 처리하는 것이 중요합니다. 이러한 요청은 네트워크 문제, 서버 오류 또는 시간 초과와 같은 다양한 이유로 실패 할 수 있습니다. Python의 요청 라이브러리는 다음과 같이 이러한 유형의 예외를 효과적으로 처리 할 수있는 방법을 제공합니다.

try:
    # URL에 GET 요청을 보냅니다
    response = requests.get(url)

    # 나쁜 응답에 대한 httperror를 높이십시오 (4xx 또는 5xx 상태 코드)
    response.raise_for_status()

except requests.exceptions.HTTPError as e:
    # HTTP 오류 처리 (404, 500 등)
    print(f"HTTP error occurred: {e}")

except requests.exceptions.RequestException as e:
    # 요청 중에 발생할 수있는 다른 예외를 처리합니다.
    print(f"An error occurred: {e}")

시도 블록은 예외를 제외 할 수있는 코드를 랩핑합니다. requests.get (URL)은 GET 요청을 보냅니다. response.raise_for_status ()는 응답 상태 코드를 확인하고 실패한 코드에 대해 httperror를 제기합니다. extperror as e : httperror 예외를 포착하고 오류 메시지를 인쇄합니다. Exections.exception.requestException ES ES : 다른 예외 (예 : 네트워크 오류, 타임 아웃)를 포착하고 오류 메시지를 인쇄합니다.

완료 코드

이제 모든 Google 금융 URL에서 데이터를 가져오고, 구문 분석하고 추출하는 스크레이퍼 기능을 만들기 위해 모든 것을 통합하겠습니다.

import requests
from lxml.html import fromstring
import json
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# 스크랩 할 URL 목록
urls = [
    "https://www.google.com/finance/quote/BNP:EPA?hl=en",
    "https://www.google.com/finance/quote/SPY:NYSEARCA?hl=en",
    "https://www.google.com/finance/quote/SENSEX:INDEXBOM?hl=en"
]

# 브라우저 방문을 모방하려면 헤더를 정의하십시오
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="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    '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/126.0.0.0 Safari/537.36',
}

# 프록시 엔드 포인트를 정의하십시오
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# 스크랩 된 데이터를 저장하려면 목록
finance_data_list = []

# 각 URL을 통해 반복하고 데이터를 스크랩합니다
for url in urls:
    try:
        # URL에 GET 요청을 보냅니다
        response = requests.get(url, headers=headers, proxies=proxies, verify=False)
        
        # 나쁜 응답에 대한 httperror를 높이십시오 (4xx 또는 5xx 상태 코드)
        response.raise_for_status()
        
        # LXML의 FromString Method를 사용하여 응답의 HTML 컨텐츠를 구문 분석하십시오.
        parser = fromstring(response.text)
        
        # 제목, 가격 및 날짜 추출
        title = parser.xpath('//div[@class="zzDege"]/text()')[0]
        price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
        date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
        
        # 추출 된 데이터를 사전에 저장하십시오
        finance_data = {
            'title': title,
            'price': price,
            'date': date
        }
        
        # 사전 Noto에 목록을 추가하십시오
        finance_data_list.append(finance_data)
    
    except requests.exceptions.HTTPError as e:
        # HTTP 오류 처리 (404, 500 등)
        print(f"HTTP error occurred for URL {url}: {e}")
    except requests.exceptions.RequestException as e:
        # 요청 중에 발생할 수있는 다른 예외를 처리합니다.
        print(f"An error occurred for URL {url}: {e}")

# Finance_Data_List를 JSON 파일로 저장하십시오
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

print(f"Scraped data saved to {output_file}")

산출:

4.png

이 안내서는`lxml` 및`requests '와 같은 강력한 라이브러리와 함께 Python을 사용하여 Google Finance의 데이터를 폐기하는 것에 대한 포괄적 인 자습서를 제공합니다. 재무 데이터 스크래핑을위한 정교한 도구를 만들기위한 토대를 마련하며, 이는 심층적 인 시장 분석을 수행하거나 경쟁 업체 활동을 모니터링하거나 정보에 입각 한 투자 결정을 지원하는 데 활용할 수 있습니다.

댓글:

0 댓글