fr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski Ce guide montre comment récupérer des données de Yahoo Finance avec Python, en utilisant les bibliothèques requests et lxml. Yahoo Finance offre de nombreuses données financières telles que les cours des actions et les tendances du marché, qui sont essentielles pour l'analyse du marché en temps réel, la modélisation financière et l'élaboration de stratégies d'investissement automatisées.
La procédure consiste à envoyer des requêtes HTTP pour récupérer le contenu de la page web, à analyser le code HTML reçu et à extraire des données spécifiques à l'aide d'expressions XPath. Cette approche permet une extraction efficace et ciblée des données, ce qui permet aux utilisateurs d'accéder aux informations financières et de les utiliser de manière dynamique.
Nous utiliserons les bibliothèques Python suivantes :
Avant de commencer, assurez-vous que ces bibliothèques sont installées :
pip install requests
pip install lxml
Ci-dessous, nous allons explorer le processus d'analyse syntaxique étape par étape, avec des exemples de code pour plus de clarté et de facilité de compréhension.
La première étape du web scraping consiste à envoyer une requête HTTP à l'URL cible. Pour ce faire, nous utiliserons la bibliothèque requests. Il est essentiel d'inclure des en-têtes appropriés dans la requête afin d'imiter un véritable navigateur, ce qui permet de contourner les mesures anti-bots de base.
import requests
from lxml import html
# URL cible
url = "https://finance.yahoo.com/quote/AMZN/"
# En-têtes pour imiter un vrai 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="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',
}
# Envoyer la requête HTTP
response = requests.get(url, headers=headers)
Après avoir reçu le contenu HTML, l'étape suivante consiste à extraire les données souhaitées à l'aide de XPath. XPath est un langage de requête puissant qui permet de sélectionner des nœuds dans un document XML, ce qui est parfait pour analyser le contenu HTML.
Titre et prix:
Plus de détails:
Vous trouverez ci-dessous les expressions XPath que nous utiliserons pour extraire différents éléments de données financières :
# Analyse du contenu HTML
parser = html.fromstring(response.content)
# Extraction de données à l'aide de 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]
# Imprimer les données extraites
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}")
Les sites web tels que Yahoo Finance emploient souvent des mesures anti-bots pour empêcher le scraping automatisé. Pour éviter d'être bloqué, vous pouvez utiliser des proxies et faire pivoter les en-têtes.
Un serveur proxy agit comme un intermédiaire entre votre machine et le site web cible. Il permet de masquer votre adresse IP, ce qui rend plus difficile pour les sites web de détecter que vous faites du scraping.
# Exemple d'utilisation d'un proxy avec le modèle d'autorisation IP
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
La rotation de l'en-tête User-Agent est un autre moyen efficace d'éviter la détection. Vous pouvez utiliser une liste de chaînes User-Agent courantes et en sélectionner une au hasard pour chaque requête.
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",
# Ajouter d'autres chaînes User-Agent ici
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Enfin, vous pouvez enregistrer les données scannées dans un fichier CSV pour une utilisation ultérieure. Cette fonction est particulièrement utile pour stocker des ensembles de données volumineux ou pour analyser les données hors ligne.
import csv
# Données à sauvegarder
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]
]
# Enregistrer dans un fichier 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")
Vous trouverez ci-dessous le script Python complet qui intègre toutes les étapes que nous avons abordées. Cela inclut l'envoi de requêtes avec des en-têtes, l'utilisation de proxies, l'extraction de données avec XPath et l'enregistrement des données dans un fichier CSV.
import requests
from lxml import html
import random
import csv
# Exemple d'URL à récupérer
url = "https://finance.yahoo.com/quote/AMZN/"
# Liste des chaînes User-Agent pour les en-têtes rotatifs
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",
# Ajouter d'autres chaînes User-Agent ici
]
# En-têtes pour imiter un vrai 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="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),
}
# Exemple d'utilisation d'un proxy
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# Envoyer la requête HTTP avec les en-têtes et les proxys optionnels
response = requests.get(url, headers=headers, proxies=proxies)
# Vérifier si la demande a abouti
if response.status_code == 200:
# Analyse du contenu HTML
parser = html.fromstring(response.content)
# Extraire des données à l'aide de 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]
# Imprimer les données extraites
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}")
# Enregistrer les données dans un fichier 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}")
L'extraction des données de Yahoo Finance à l'aide de Python est un moyen puissant d'automatiser la collecte de données financières. En utilisant les bibliothèques requests et lxml, ainsi que les en-têtes, proxies et mesures anti-bots appropriés, vous pouvez efficacement récupérer et stocker des données boursières à des fins d'analyse. Ce guide a couvert les bases, mais n'oubliez pas d'adhérer aux directives légales et éthiques lorsque vous scrapez des sites web.
Commentaires: 0