Comment récupérer les données financières de Google avec Python

Commentaires: 0

Aujourd'hui, les investisseurs et les analystes utilisent les informations de Google Finance car elles sont actuelles et précises. Google Finance semble être l'endroit préféré pour obtenir des données financières actuelles de tous types, en particulier pour les actions, les indices et les tendances du marché, car il donne plus de détails sur les mesures financières des entreprises. Python est le meilleur langage pour le web scraping. Ce billet vous aidera à apprendre comment collecter des données à partir de Google Finance afin de disposer de tous les outils d'analyse financière nécessaires.

Installation des bibliothèques nécessaires

Avant de commencer, assurez-vous que Python est installé sur votre système. Vous aurez également besoin des bibliothèques : requests pour effectuer des requêtes HTTP et lxml pour analyser le contenu HTML des pages web. Pour installer les bibliothèques requises, utilisez les commandes suivantes sur la ligne de commande :

pip install requests
pip install lxml

Nous allons maintenant explorer le processus d'extraction des données de Google Finance, étape par étape :

Étape 1 : Comprendre la structure HTML

Pour extraire des données de Google Finance, nous devons identifier les éléments HTML spécifiques qui contiennent les informations qui nous intéressent :

  • Titre : situé à //div[@class="zzDege"]/text()
  • Prix : trouvé sur //div[@class="YMlKec fxKbKc"]/text()
  • Date : situé à //div[@class="ygUjEc"]/text()

Ces expressions XPath nous serviront de guide pour naviguer et extraire les données pertinentes de la structure HTML des pages de Google Finance.

Titre:

1.png

Prix:

2.png

Date:

3.png

Etape 2 : configuration de la fonction de raclage

Lors de la configuration d'un scraper, il est crucial de se concentrer sur plusieurs aspects importants pour garantir une collecte de données efficace et sécurisée.

Réalisation d'une requête HTTP

Pour récupérer le contenu HTML du site Web de Google Finance, nous utiliserons la bibliothèque de requêtes. Cette étape initie le processus en chargeant la page web à partir de laquelle nous avons l'intention d'extraire des données.

Importance de l'utilisation d'en-têtes corrects dans le scraping

Il est très important d'utiliser les bons en-têtes lors du web scraping, en particulier l'en-tête User-Agent. L'utilisation d'en-têtes est essentielle pour simuler une requête authentique du navigateur qui empêchera le site d'identifier et d'arrêter votre script automatique. Ils permettent de s'assurer que le serveur répond correctement en donnant des informations pertinentes sur la requête. En l'absence d'en-têtes appropriés, la demande peut être refusée ou le serveur peut renvoyer un contenu complètement différent ou fournir un contenu en portions qui peuvent restreindre l'activité de web scraping. Par conséquent, le fait de définir les en-têtes de manière appropriée permet de maintenir l'accès au site web et de s'assurer que le scrapeur récupère les données correctes.

import requests

# Définir les en-têtes pour imiter la visite d'un navigateur et éviter d'être bloqué par le serveur
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',  # En-tête de la demande 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',
}

# Définir l'URL de la page Google Finance de BNP Paribas (ticker BNP) sur la bourse Euronext Paris (EPA)
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"

# Effectuer la requête HTTP GET à l'URL avec les en-têtes spécifiés
response = requests.get(url, headers=headers)

Importance de l'utilisation des proxys

Lorsque vous scrapez Google Finance ou tout autre site web à grande échelle, il est essentiel d'utiliser des proxys. Voici pourquoi :

  • Éviter les interdictions d'IP : les sites web tels que Google Finance bloquent ou restreignent souvent l'accès des adresses IP qui effectuent trop de requêtes sur une courte période. Les serveurs mandataires permettent de répartir les demandes sur plusieurs adresses IP, ce qui réduit les risques de détection et d'interdiction.
  • Confidentialité accrue : l'utilisation de proxys ajoute une couche d'anonymat, protégeant votre identité et vos intentions lorsque vous scrappez des données.
# Définir les paramètres du proxy
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Effectuer la requête HTTP GET à l'URL avec les en-têtes et les proxies spécifiés.
response = requests.get(url, headers=headers, proxies=proxies)

L'analyse du HTML avec lxml

Une fois que nous avons récupéré le contenu HTML, nous devons l'analyser à l'aide de la bibliothèque lxml. Cela nous permettra de naviguer dans la structure HTML et d'extraire les données dont nous avons besoin :

La fonction fromstring de lxml.html est importée pour analyser le contenu HTML dans un objet Element. La méthode fromstring analyse response.text, le code HTML brut de la page web récupérée précédemment, et renvoie un objet Element stocké dans la variable parser, représentant la racine de l'arbre HTML analysé.

from lxml.html import fromstring

# Parse the HTML content of the response using lxml's fromstring method
parser = fromstring(response.text)

Extraire des données avec XPath

Maintenant, extrayons des données spécifiques à l'aide d'expressions XPath à partir de l'arbre HTML analysé :

Le titre extrait le titre de l'instrument financier du code HTML analysé. Le prix extrait le cours actuel de l'action. La date récupère la date. Le dictionnaire finance_data contient le titre, le prix et la date extraits. Ce dictionnaire est ajouté à une liste.

# Liste de stockage des données de sortie
finance_data_list = []

# Extraction du titre de l'instrument financier
title = parser.xpath('//div[@class="zzDege"]/text()')[0]

# Extraction du prix actuel de l'action
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]

# Extraction de la date
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]

# Création d'un dictionnaire pour stocker les données extraites
finance_data = {
    'title': title,
    'price': price,
    'date': date
}
# ajouter des données à finance_data_list
finance_data_list.append(finance_data)

Traitement et stockage des données

Pour gérer les données extraites, vous pouvez les traiter ou les stocker dans un format structuré tel que JSON :

La variable output_file spécifie le nom du fichier JSON dans lequel les données seront enregistrées (finance_data.json). La commande open(output_file, 'w') ouvre le fichier en mode écriture, et json.dump(finance_data_list, f, indent=4) écrit la finance_data_list dans le fichier avec une indentation de 4 espaces pour plus de lisibilité.

# Enregistrer finance_data_list dans un fichier JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

Gestion des exceptions de requête

Lors de l'extraction de données de sites web, il est important de gérer les exceptions de requête afin de garantir la fiabilité et la robustesse de votre script d'extraction. Ces requêtes peuvent échouer pour diverses raisons, telles que des problèmes de réseau, des erreurs de serveur ou des dépassements de délai. La bibliothèque requests de Python permet de gérer efficacement ces types d'exceptions, comme indiqué ci-dessous :

try:
    # Envoi d'une requête GET à l'URL
    response = requests.get(url)

    # Lever une erreur HTTPError pour les mauvaises réponses (codes d'état 4xx ou 5xx)
    response.raise_for_status()

except requests.exceptions.HTTPError as e:
    # Gérer les erreurs HTTP (comme 404, 500, etc.)
    print(f"HTTP error occurred: {e}")

except requests.exceptions.RequestException as e:
    # Gérer toute autre exception pouvant survenir au cours de la demande
    print(f"An error occurred: {e}")

Le bloc try contient le code susceptible de soulever des exceptions. La fonction requests.get(url) envoie une requête GET. La fonction response.raise_for_status() vérifie le code d'état de la réponse et lève une HTTPError en cas d'échec. Le except requests.exceptions.HTTPError as e : attrape les exceptions HTTPError et imprime le message d'erreur. L'exception requests.exceptions.RequestException as e : attrape d'autres exceptions (par exemple, des erreurs de réseau, des dépassements de délai) et imprime le message d'erreur.

Code complet

Maintenant, intégrons tout pour créer notre fonction de scraper qui récupère, analyse et extrait des données de plusieurs URL de 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()


# Liste des URL à récupérer
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"
]

# Définir des en-têtes pour imiter la visite d'un navigateur
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',
}

# Définir le point de terminaison du proxy
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Liste de stockage des données extraites
finance_data_list = []

# Interroger chaque URL et récupérer les données
for url in urls:
    try:
        # Envoi d'une requête GET à l'URL
        response = requests.get(url, headers=headers, proxies=proxies, verify=False)
        
        # Lever une erreur HTTPError pour les mauvaises réponses (codes d'état 4xx ou 5xx)
        response.raise_for_status()
        
        # Analyse le contenu HTML de la réponse à l'aide de la méthode fromstring de lxml
        parser = fromstring(response.text)
        
        # Extraction du titre, du prix et de la date
        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]
        
        # Stocker les données extraites dans un dictionnaire
        finance_data = {
            'title': title,
            'price': price,
            'date': date
        }
        
        # Ajouter la note du dictionnaire à la liste
        finance_data_list.append(finance_data)
    
    except requests.exceptions.HTTPError as e:
        # Gérer les erreurs HTTP (comme 404, 500, etc.)
        print(f"HTTP error occurred for URL {url}: {e}")
    except requests.exceptions.RequestException as e:
        # Gérer toute autre exception pouvant survenir au cours de la demande
        print(f"An error occurred for URL {url}: {e}")

# Enregistrer finance_data_list dans un fichier 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}")

Sortie:

4.png

Ce guide propose un tutoriel complet sur le scraping de données de Google Finance en utilisant Python, ainsi que des bibliothèques puissantes comme `lxml` et `requests`. Il pose les bases de la création d'outils sophistiqués de récupération de données financières, qui peuvent être utilisés pour mener des analyses de marché approfondies, surveiller les activités des concurrents ou soutenir des décisions d'investissement éclairées.

Commentaires:

0 Commentaires