Come raschiare i dati finanziari di Google con Python

Commenti: 0

Gli investitori e gli analisti di oggi utilizzano le informazioni di Google Finance perché sono aggiornate e precise. Google Finance sembra essere il luogo preferito per avere dati finanziari attuali di tutti i tipi, specialmente per le azioni insieme agli indici e alle tendenze del mercato, poiché fornisce maggiori dettagli sulle metriche finanziarie delle aziende. Python è il miglior linguaggio per il web scraping. Questo post vi aiuterà a capire come raccogliere dati da Google Finance in modo da avere tutti gli strumenti di analisi finanziaria necessari.

Installazione delle librerie necessarie

Prima di iniziare, assicuratevi di avere installato Python sul vostro sistema. Sono inoltre necessarie le librerie requests per effettuare richieste HTTP e lxml per analizzare il contenuto HTML delle pagine web. Per installare le librerie necessarie, utilizzate i seguenti comandi alla riga di comando:

pip install requests
pip install lxml

Esploriamo il processo di estrazione dei dati da Google Finance passo dopo passo:

Fase 1: capire la struttura HTML

Per estrarre i dati da Google Finance, dobbiamo identificare gli elementi HTML specifici che contengono le informazioni che ci interessano:

  • Titolo: si trova a //div[@class="zzDege"]/text()
  • Prezzo: si trova presso //div[@class="YMlKec fxKbKc"]/text()
  • Data: si trova a //div[@class="ygUjEc"]/text()

Queste espressioni XPath ci serviranno da guida per navigare ed estrarre i dati rilevanti dalla struttura HTML delle pagine di Google Finance.

Titolo:

1.png

Prezzo:

2.png

Data:

3.png

Passo 2: Impostazione della funzione scraper

Quando si imposta uno scraper, è fondamentale concentrarsi su diversi aspetti importanti per garantire una raccolta dati efficiente e sicura.

Esecuzione della richiesta HTTP

Per recuperare il contenuto HTML dal sito web di Google Finance, utilizzeremo la libreria requests. Questa fase avvia il processo caricando la pagina web da cui intendiamo estrarre i dati.

Importanza dell'uso di intestazioni corrette nello scraping

È molto importante utilizzare le intestazioni corrette durante lo scraping del Web, in particolare l'intestazione User-Agent. L'uso delle intestazioni è essenziale per simulare una vera richiesta del browser che impedirà al sito di identificare e bloccare il vostro script automatico. Esse assicurano che il server risponda correttamente fornendo informazioni rilevanti sulla richiesta. In assenza di intestazioni corrette, la richiesta potrebbe essere rifiutata o il server potrebbe restituire contenuti completamente diversi o fornire contenuti in porzioni che potrebbero limitare l'attività di web scraping. Pertanto, impostare le intestazioni in modo appropriato aiuta a mantenere l'accesso al sito web e garantisce che lo scraper recuperi i dati corretti.

import requests

# Definire le intestazioni per simulare una visita del browser ed evitare di essere bloccati dal server.
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',  # Intestazione della richiesta Do Not Track
    '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',
}

# Definire l'URL della pagina Google Finance di BNP Paribas (ticker BNP) sulla borsa Euronext Paris (EPA).
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"

# Eseguire la richiesta HTTP GET all'URL con le intestazioni specificate.
response = requests.get(url, headers=headers)

Importanza dell'uso dei proxy

Quando si effettua lo scraping di Google Finance o di qualsiasi sito web in scala, è fondamentale utilizzare i proxy. Ecco perché:

  • Evitare i divieti IP: siti web come Google Finance spesso bloccano o limitano l'accesso da indirizzi IP che effettuano un numero eccessivo di richieste in un breve periodo. I proxy aiutano a distribuire le richieste su più indirizzi IP, riducendo le possibilità di rilevamento e di divieto.
  • Maggiore privacy: l'uso dei proxy aggiunge un livello di anonimato, proteggendo la vostra identità e le vostre intenzioni durante lo scraping dei dati.
# Definire le impostazioni del proxy
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Eseguire la richiesta HTTP GET all'URL con le intestazioni e i proxy specificati.
response = requests.get(url, headers=headers, proxies=proxies)

Parlare HTML con lxml

Una volta recuperato il contenuto HTML, dobbiamo analizzarlo utilizzando la libreria lxml. Questo ci permetterà di navigare attraverso la struttura HTML e di estrarre i dati di cui abbiamo bisogno:

La funzione fromstring di lxml.html viene importata per analizzare il contenuto HTML in un oggetto Element. Il metodo fromstring analizza response.text, l'HTML grezzo della pagina web recuperata in precedenza, e restituisce un oggetto Element memorizzato nella variabile parser, che rappresenta la radice dell'albero HTML analizzato.

from lxml.html import fromstring

# Analizzare il contenuto HTML della risposta utilizzando il metodo fromstring di lxml
parser = fromstring(response.text)

Estrazione di dati con XPath

Ora estraiamo dati specifici usando le espressioni XPath dall'albero HTML analizzato:

Il titolo recupera il titolo dello strumento finanziario dall'HTML analizzato. Il prezzo recupera il prezzo corrente del titolo. La data recupera la data. Il dizionario finance_data contiene il titolo, il prezzo e la data estratti. Questo dizionario viene aggiunto a un elenco.

# Elenco per memorizzare i dati di uscita
finance_data_list = []

# Estrazione del titolo dello strumento finanziario
title = parser.xpath('//div[@class="zzDege"]/text()')[0]

# Estrazione del prezzo corrente del titolo
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]

# Estrazione della data
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]

# Creazione di un dizionario per memorizzare i dati estratti
finance_data = {
    'title': title,
    'price': price,
    'date': date
}
# aggiungere i dati all'elenco finance_data_list
finance_data_list.append(finance_data)

Gestione e archiviazione dei dati

Per gestire i dati di scraping, si potrebbe volerli elaborare ulteriormente o memorizzarli in un formato strutturato come JSON:

La variabile output_file specifica il nome del file JSON in cui verranno salvati i dati (finance_data.json). Il comando open(output_file, 'w') apre il file in modalità di scrittura e json.dump(finance_data_list, f, indent=4) scrive la lista finance_data_list nel file con un'indentazione di 4 spazi per la leggibilità.

# Salvare l'elenco finance_data_list in un file JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

Gestione delle eccezioni di richiesta

Durante lo scraping di dati da siti web, è importante gestire le eccezioni di richiesta per garantire l'affidabilità e la robustezza dello script di scraping. Queste richieste possono fallire per vari motivi, come problemi di rete, errori del server o timeout. La libreria requests di Python offre un modo per gestire efficacemente questi tipi di eccezioni, come mostrato di seguito:

try:
    # Invio di una richiesta GET all'URL
    response = requests.get(url)

    # Solleva un HTTPError per le risposte errate (codici di stato 4xx o 5xx).
    response.raise_for_status()

except requests.exceptions.HTTPError as e:
    # Gestire gli errori HTTP (come 404, 500, ecc.)
    print(f"HTTP error occurred: {e}")

except requests.exceptions.RequestException as e:
    # Gestire qualsiasi altra eccezione che possa verificarsi durante la richiesta
    print(f"An error occurred: {e}")

Il blocco try racchiude il codice che può sollevare eccezioni. Il metodo requests.get(url) invia una richiesta GET. Il metodo response.raise_for_status() controlla il codice di stato della risposta e solleva un HTTPError per i codici non riusciti. L'eccezione requests.except.exceptions.HTTPError as e: cattura le eccezioni HTTPError e stampa il messaggio di errore. L'eccezione requests.exceptions.RequestException as e: cattura altre eccezioni (ad esempio, errori di rete, timeout) e stampa il messaggio di errore.

Codice completo

Ora, integriamo tutto per creare la nostra funzione scraper che recupera, analizza ed estrae i dati da più URL di Google Finance:

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()


# Elenco degli URL da raschiare
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"
]

# Definire le intestazioni per simulare la visita di un 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="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',
}

# Definire l'endpoint del proxy
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Elenco per memorizzare i dati di scraping
finance_data_list = []

# Iterare ogni URL e raschiare i dati
for url in urls:
    try:
        # Invio di una richiesta GET all'URL
        response = requests.get(url, headers=headers, proxies=proxies, verify=False)
        
        # Raise an HTTPError for bad responses (4xx or 5xx status codes)
        response.raise_for_status()
        
        # Analizzare il contenuto HTML della risposta utilizzando il metodo fromstring di lxml
        parser = fromstring(response.text)
        
        # Estrazione di titolo, prezzo e data
        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]
        
        # Memorizzare i dati estratti in un dizionario
        finance_data = {
            'title': title,
            'price': price,
            'date': date
        }
        
        # Aggiungere la nota del dizionario all'elenco
        finance_data_list.append(finance_data)
    
    except requests.exceptions.HTTPError as e:
        # Gestire gli errori HTTP (come 404, 500, ecc.)
        print(f"HTTP error occurred for URL {url}: {e}")
    except requests.exceptions.RequestException as e:
        # Gestire qualsiasi altra eccezione che possa verificarsi durante la richiesta
        print(f"An error occurred for URL {url}: {e}")

# Salvare l'elenco di dati_finanziari in un file 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}")

Uscita:

4.png

Questa guida offre un tutorial completo sullo scraping di dati da Google Finance utilizzando Python, insieme a potenti librerie come `lxml` e `request`. La guida pone le basi per la creazione di strumenti sofisticati per lo scraping di dati finanziari, che possono essere utilizzati per condurre analisi di mercato approfondite, monitorare le attività dei concorrenti o supportare decisioni di investimento informate.

Commenti:

0 Commenti