Guida allo scraping dei dati di Yahoo Finance con Python

Commenti: 0

Questa guida mostra come effettuare lo scraping di dati da Yahoo Finance utilizzando Python, impiegando le librerie requests e lxml. Yahoo Finance offre ampi dati finanziari, come i prezzi delle azioni e le tendenze del mercato, che sono fondamentali per le analisi di mercato in tempo reale, la modellazione finanziaria e la creazione di strategie di investimento automatizzate.

La procedura prevede l'invio di richieste HTTP per recuperare il contenuto della pagina web, l'analisi dell'HTML ricevuto e l'estrazione di dati specifici mediante espressioni XPath. Questo approccio consente un'estrazione efficiente e mirata dei dati, permettendo agli utenti di accedere e utilizzare le informazioni finanziarie in modo dinamico.

Strumenti e librerie

Utilizzeremo le seguenti librerie Python:

  • requests: per inviare richieste HTTP al sito web di Yahoo Finance.
  • lxml: per analizzare il contenuto HTML ed estrarre i dati usando XPath.

Prima di iniziare, assicuratevi di avere installato queste librerie:


pip install requests
pip install  lxml

Il web scraping con Python spiegato

Di seguito, esploreremo il processo di parsing in modo graduale, con esempi di codice per chiarezza e facilità di comprensione.

Fase 1: invio di una richiesta

Il primo passo del web scraping è l'invio di una richiesta HTTP all'URL di destinazione. Per farlo, si utilizzerà la libreria requests. È fondamentale includere intestazioni corrette nella richiesta per imitare un browser reale, il che aiuta a bypassare le misure anti-bot di base.


import requests
from lxml import html

# URL di destinazione
url = "https://finance.yahoo.com/quote/AMZN/"

# Intestazioni per imitare un vero browser
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',
}

# Inviare la richiesta HTTP
response = requests.get(url, headers=headers)

Fase 2: Estrarre i dati con XPath

Dopo aver ricevuto il contenuto HTML, il passo successivo consiste nell'estrarre i dati desiderati utilizzando XPath. XPath è un potente linguaggio di interrogazione per selezionare i nodi di un documento XML, perfetto per analizzare il contenuto HTML.

Titolo e prezzo:

scraping.png

Maggiori dettagli:

scraping2.png

Di seguito sono riportate le espressioni XPath che utilizzeremo per estrarre diversi dati finanziari:


# Analizzare il contenuto HTML
parser = html.fromstring(response.content)

# Estrazione di dati con 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]

# Stampare i dati estratti
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}")

Fase 3: Gestione di proxy e intestazioni

Siti web come Yahoo Finance impiegano spesso misure anti-bot per impedire lo scraping automatico. Per evitare di essere bloccati, è possibile utilizzare i proxy e ruotare le intestazioni.

Usare i proxy

Un server proxy funge da intermediario tra il vostro computer e il sito web di destinazione. Aiuta a mascherare il vostro indirizzo IP, rendendo più difficile per i siti web rilevare che state facendo scraping.


# Esempio di utilizzo di un proxy con modello di autorizzazione IP
proxies = {
    "http": "http://your.proxy.server:port",
    "https": "https://your.proxy.server:port"
}

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

Rotazione delle intestazioni User-Agent

La rotazione dell'intestazione User-Agent è un altro modo efficace per evitare il rilevamento. È possibile utilizzare un elenco di stringhe User-Agent comuni e selezionarne casualmente una per ogni richiesta.


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",
    # Aggiungere altre stringhe User-Agent qui
]

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

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

Fase 4: Salvare i dati in un file CSV

Infine, è possibile salvare i dati scraped in un file CSV per un uso successivo. Questa operazione è particolarmente utile per archiviare grandi insiemi di dati o per analizzare i dati offline.


import csv

# Dati da salvare
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]
]

# Salvare in un file 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")

Codice completo

Di seguito è riportato lo script Python completo che integra tutti i passaggi discussi. Questo include l'invio di richieste con intestazioni, l'uso di proxy, l'estrazione di dati con XPath e il salvataggio dei dati in un file CSV.


import requests
from lxml import html
import random
import csv

# Esempio di URL da raschiare
url = "https://finance.yahoo.com/quote/AMZN/"

# Elenco delle stringhe User-Agent per la rotazione delle intestazioni
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",
    # Aggiungere altre stringhe User-Agent qui
]

# Intestazioni per imitare un vero browser
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),
}

# Esempio di utilizzo di un proxy
proxies = {
    "http": "http://your.proxy.server:port",
    "https": "https://your.proxy.server:port"
}

# Inviare la richiesta HTTP con le intestazioni e i proxy opzionali
response = requests.get(url, headers=headers, proxies=proxies)

# Controllare se la richiesta è andata a buon fine
if response.status_code == 200:
    # Analizzare il contenuto HTML
    parser = html.fromstring(response.content)

    # Estrarre i dati con 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]

    # Stampare i dati estratti
    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}")

    # Salvare i dati in un file 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}")

Lo scraping dei dati di Yahoo Finance con Python è un modo potente per automatizzare la raccolta di dati finanziari. Utilizzando le librerie requests e lxml, insieme a intestazioni, proxy e misure anti-bot appropriate, è possibile effettuare uno scraping efficiente e memorizzare i dati azionari per l'analisi. Questa guida ha trattato le nozioni di base, ma ricordate di rispettare le linee guida legali ed etiche quando fate scraping di siti web.

Commenti:

0 Commenti