Anleitung zum Scrapen von Yahoo Finance-Daten mit Python

Bemerkungen: 0

Diese Anleitung zeigt, wie man mit Python und den Bibliotheken requests und lxml Daten von Yahoo Finance auslesen kann. Yahoo Finance bietet umfangreiche Finanzdaten wie Aktienkurse und Markttrends, die für die Echtzeit-Marktanalyse, die Finanzmodellierung und die Entwicklung automatisierter Anlagestrategien von zentraler Bedeutung sind.

Das Verfahren umfasst das Senden von HTTP-Anfragen zum Abrufen des Webseiteninhalts, das Parsen des empfangenen HTML und das Extrahieren spezifischer Daten mithilfe von XPath-Ausdrücken. Dieser Ansatz ermöglicht eine effiziente und gezielte Datenextraktion, so dass die Benutzer dynamisch auf Finanzinformationen zugreifen und diese nutzen können.

Tools und Bibliotheken

Wir werden die folgenden Python-Bibliotheken verwenden:

  • requests: Zum Senden von HTTP-Anfragen an die Yahoo Finance-Website.
  • lxml: Parsen des HTML-Inhalts und Extrahieren von Daten mit XPath.

Bevor Sie beginnen, vergewissern Sie sich, dass Sie diese Bibliotheken installiert haben:


pip install requests
pip install  lxml

Web Scraping mit Python erklärt

Im Folgenden wird der Parsing-Prozess Schritt für Schritt erklärt, mit Code-Beispielen zur Verdeutlichung und zum besseren Verständnis.

Schritt 1: Senden einer Anfrage

Der erste Schritt beim Web Scraping ist das Senden einer HTTP-Anfrage an die Ziel-URL. Wir werden dazu die requests-Bibliothek verwenden. Es ist wichtig, die richtigen Header in die Anfrage einzuschließen, um einen echten Browser zu imitieren, was dabei hilft, grundlegende Anti-Bot-Maßnahmen zu umgehen.


import requests
from lxml import html

# Ziel-URL
url = "https://finance.yahoo.com/quote/AMZN/"

# Kopfzeilen zur Nachahmung eines echten Browsers
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',
}

# Senden Sie die HTTP-Anfrage
response = requests.get(url, headers=headers)

Schritt 2: Daten mit XPath extrahieren

Nachdem der HTML-Inhalt empfangen wurde, besteht der nächste Schritt darin, die gewünschten Daten mit XPath zu extrahieren. XPath ist eine leistungsfähige Abfragesprache zur Auswahl von Knoten aus einem XML-Dokument, die sich hervorragend zum Parsen von HTML-Inhalten eignet.

Titel und Preis:

scraping.png

Mehr Details:

scraping2.png

Nachfolgend finden Sie die XPath-Ausdrücke, die wir verwenden werden, um verschiedene Finanzdaten zu extrahieren:


# Analysieren Sie den HTML-Inhalt
parser = html.fromstring(response.content)

# Extrahieren von Daten mit 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]

# Drucken der extrahierten Daten
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}")

Schritt 3: Umgang mit Proxys und Kopfzeilen

Websites wie Yahoo Finance setzen oft Anti-Bot-Maßnahmen ein, um automatisches Scraping zu verhindern. Um nicht blockiert zu werden, können Sie Proxys verwenden und Header drehen.

Verwendung von Proxys

Ein Proxy-Server fungiert als Vermittler zwischen Ihrem Rechner und der Ziel-Website. Er hilft dabei, Ihre IP-Adresse zu verschleiern, so dass es für Websites schwieriger wird, zu erkennen, dass Sie Scraping betreiben.


# Beispiel für die Verwendung eines Proxys mit IP-Autorisierungsmodell
proxies = {
    "http": "http://your.proxy.server:port",
    "https": "https://your.proxy.server:port"
}

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

Drehende User-Agent-Kopfzeilen

Das Drehen des User-Agent-Headers ist eine weitere wirksame Methode, um eine Entdeckung zu vermeiden. Sie können eine Liste gängiger User-Agent-Zeichenfolgen verwenden und für jede Anfrage eine zufällig auswählen.


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",
    # Weitere User-Agent-Zeichenfolgen hier hinzufügen
]

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

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

Schritt 4: Speichern der Daten in einer CSV-Datei

Schließlich können Sie die gescrapten Daten zur späteren Verwendung in einer CSV-Datei speichern. Dies ist besonders nützlich, um große Datensätze zu speichern oder die Daten offline zu analysieren.


import csv

# Zu speichernde Daten
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]
]

# In CSV-Datei speichern
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")

Kompletter Code

Nachfolgend finden Sie das vollständige Python-Skript, in das alle besprochenen Schritte integriert sind. Dazu gehören das Senden von Anfragen mit Headern, die Verwendung von Proxys, das Extrahieren von Daten mit XPath und das Speichern der Daten in einer CSV-Datei.


import requests
from lxml import html
import random
import csv

# Beispiel-URL zum Scrapen
url = "https://finance.yahoo.com/quote/AMZN/"

# Liste der User-Agent-Zeichenfolgen für rotierende Kopfzeilen
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
]

# Kopfzeilen zur Nachahmung eines echten Browsers
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),
}

# Beispiel für die Verwendung eines Proxys
proxies = {
    "http": "http://your.proxy.server:port",
    "https": "https://your.proxy.server:port"
}

# Senden Sie die HTTP-Anfrage mit Headern und optionalen Proxys
response = requests.get(url, headers=headers, proxies=proxies)

# Prüfen, ob die Anfrage erfolgreich war
if response.status_code == 200:
    # Analysieren Sie den HTML-Inhalt
    parser = html.fromstring(response.content)

    # Daten mit XPath extrahieren
    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]

    # Drucken der extrahierten Daten
    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}")

    # Speichern der Daten in einer CSV-Datei
    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}")

Das Scraping von Yahoo Finance-Daten mit Python ist eine leistungsstarke Möglichkeit, die Erfassung von Finanzdaten zu automatisieren. Mit den Bibliotheken requests und lxml sowie den richtigen Headern, Proxies und Anti-Bot-Maßnahmen können Sie Börsendaten effizient auslesen und für die Analyse speichern. In diesem Leitfaden wurden die Grundlagen behandelt. Denken Sie jedoch daran, beim Scrapen von Websites die rechtlichen und ethischen Richtlinien einzuhalten.

Bemerkungen:

0 Bemerkungen