Przewodnik po skrobaniu danych Yahoo Finance za pomocą Pythona

Komentarze: 0

Ten przewodnik pokazuje, jak skrobać dane z Yahoo Finance za pomocą Pythona, wykorzystując biblioteki requests i lxml. Yahoo Finance oferuje obszerne dane finansowe, takie jak ceny akcji i trendy rynkowe, które są kluczowe dla analizy rynku w czasie rzeczywistym, modelowania finansowego i tworzenia zautomatyzowanych strategii inwestycyjnych.

Procedura obejmuje wysyłanie żądań HTTP w celu pobrania zawartości strony internetowej, analizowanie otrzymanego kodu HTML i wyodrębnianie określonych danych za pomocą wyrażeń XPath. Takie podejście umożliwia wydajną i ukierunkowaną ekstrakcję danych, umożliwiając użytkownikom dynamiczny dostęp i wykorzystanie informacji finansowych.

Narzędzia i biblioteki

Będziemy używać następujących bibliotek Pythona:

  • requests: Do wysyłania żądań HTTP do witryny Yahoo Finance.
  • lxml: Do analizowania zawartości HTML i wyodrębniania danych za pomocą XPath.

Przed rozpoczęciem upewnij się, że masz zainstalowane te biblioteki:


pip install requests
pip install  lxml

Web scraping z wyjaśnieniem Pythona

Poniżej przeanalizujemy proces parsowania krok po kroku, wraz z przykładami kodu dla jasności i łatwości zrozumienia.

Krok 1: Wysyłanie żądania

Pierwszym krokiem w web scrapingu jest wysłanie żądania HTTP do docelowego adresu URL. W tym celu użyjemy biblioteki requests. Kluczowe jest dołączenie odpowiednich nagłówków do żądania, aby naśladować prawdziwą przeglądarkę, co pomaga w ominięciu podstawowych zabezpieczeń przed botami.


import requests
from lxml import html

# Docelowy adres URL
url = "https://finance.yahoo.com/quote/AMZN/"

# Nagłówki naśladujące prawdziwą przeglądarkę
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',
}

# Wysyłanie żądania HTTP
response = requests.get(url, headers=headers)

Krok 2: Wyodrębnianie danych za pomocą XPath

Po otrzymaniu zawartości HTML, następnym krokiem jest wyodrębnienie pożądanych danych za pomocą XPath. XPath to potężny język zapytań do wybierania węzłów z dokumentu XML, który doskonale nadaje się do analizowania treści HTML.

Tytuł i cena:

scraping.png

Więcej szczegółów:

scraping2.png

Poniżej znajdują się wyrażenia XPath, których użyjemy do wyodrębnienia różnych danych finansowych:


# Parsowanie zawartości HTML
parser = html.fromstring(response.content)

# Wyodrębnianie danych przy użyciu 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]

# Drukowanie wyodrębnionych danych
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}")

Krok 3: Obsługa serwerów proxy i nagłówków

Strony takie jak Yahoo Finance często stosują środki zapobiegające botom, aby zapobiec automatycznemu skrobaniu. Aby uniknąć zablokowania, można korzystać z serwerów proxy i obracać nagłówki.

Używanie serwerów proxy

Serwer proxy działa jako pośrednik między komputerem użytkownika a docelową witryną internetową. Pomaga on zamaskować adres IP użytkownika, utrudniając witrynom wykrycie scrapingu.


# Przykład użycia serwera proxy z modelem autoryzacji IP
proxies = {
    "http": "http://your.proxy.server:port",
    "https": "https://your.proxy.server:port"
}

response = requests.get(url, headers=headers, proxies=proxies)

Obracanie nagłówków User-Agent

Obracanie nagłówków User-Agent to kolejny skuteczny sposób na uniknięcie wykrycia. Możesz użyć listy typowych ciągów User-Agent i losowo wybrać jeden dla każdego żądania.


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",
    # Dodaj więcej ciągów User-Agent tutaj
]

headers["user-agent"]: random.choice(user_agents)

response = requests.get(url, headers=headers)

Krok 4: Zapisywanie danych do pliku CSV

Na koniec możesz zapisać zeskrobane dane w pliku CSV do późniejszego wykorzystania. Jest to szczególnie przydatne w przypadku przechowywania dużych zbiorów danych lub analizowania danych w trybie offline.


import csv

# Dane do zapisania
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]
]

# Zapisz do pliku 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")

Kompletny kod

Poniżej znajduje się kompletny skrypt Pythona, który integruje wszystkie kroki, które omówiliśmy. Obejmuje to wysyłanie żądań z nagłówkami, korzystanie z serwerów proxy, wyodrębnianie danych za pomocą XPath i zapisywanie danych do pliku CSV.


import requests
from lxml import html
import random
import csv

# Przykładowy adres URL do zeskrobania
url = "https://finance.yahoo.com/quote/AMZN/"

# Lista ciągów User-Agent dla obracających się nagłówków
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
]

# Nagłówki naśladujące prawdziwą przeglądarkę
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),
}

# Przykład użycia proxy
proxies = {
    "http": "http://your.proxy.server:port",
    "https": "https://your.proxy.server:port"
}

# Wyślij żądanie HTTP z nagłówkami i opcjonalnymi serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)

# Sprawdź, czy żądanie się powiodło
if response.status_code == 200:
    # Parsowanie zawartości HTML
    parser = html.fromstring(response.content)

    # Wyodrębnianie danych przy użyciu 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]

    # Drukowanie wyodrębnionych danych
    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}")

    # Zapisywanie danych w pliku 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}")

Skrobanie danych Yahoo Finance za pomocą Pythona to potężny sposób na zautomatyzowanie gromadzenia danych finansowych. Korzystając z bibliotek requests i lxml, wraz z odpowiednimi nagłówkami, serwerami proxy i środkami zapobiegającymi botom, można skutecznie skrobać i przechowywać dane giełdowe do analizy. Niniejszy przewodnik obejmuje podstawy, ale należy pamiętać o przestrzeganiu wytycznych prawnych i etycznych podczas skrobania stron internetowych.

Komentarze:

0 komentarze