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.
Utilizzeremo le seguenti librerie Python:
Prima di iniziare, assicuratevi di avere installato queste librerie:
pip install requests
pip install lxml
Di seguito, esploreremo il processo di parsing in modo graduale, con esempi di codice per chiarezza e facilità di comprensione.
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)
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:
Maggiori dettagli:
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}")
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.
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)
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)
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")
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Commenti: 0