Esta guía muestra cómo extraer datos de Yahoo Finanzas utilizando Python, empleando las bibliotecas requests y lxml. Yahoo Finanzas ofrece una gran cantidad de datos financieros, como los precios de las acciones y las tendencias del mercado, que son fundamentales para el análisis de mercado en tiempo real, el modelado financiero y la elaboración de estrategias de inversión automatizadas.
El procedimiento consiste en enviar peticiones HTTP para recuperar el contenido de la página web, analizar el HTML recibido y extraer datos específicos mediante expresiones XPath. Este enfoque permite una extracción de datos eficiente y específica, permitiendo a los usuarios acceder y utilizar la información financiera de forma dinámica.
Utilizaremos las siguientes librerías de Python:
Antes de empezar, asegúrate de tener instaladas estas librerías:
pip install requests
pip install lxml
A continuación, exploraremos el proceso de análisis sintáctico paso a paso, completo con ejemplos de código para mayor claridad y facilidad de comprensión.
El primer paso en el web scraping es enviar una petición HTTP a la URL de destino. Para ello utilizaremos la librería requests. Es crucial incluir cabeceras adecuadas en la petición para imitar un navegador real, lo que ayuda a eludir las medidas básicas anti-bot.
import requests
from lxml import html
# URL de destino
url = "https://finance.yahoo.com/quote/AMZN/"
# Cabeceras para imitar un navegador real
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',
}
# Enviar la petición HTTP
response = requests.get(url, headers=headers)
Después de recibir el contenido HTML, el siguiente paso es extraer los datos deseados usando XPath. XPath es un potente lenguaje de consulta para seleccionar nodos de un documento XML, perfecto para analizar contenido HTML.
Título y precio:
Saber más:
A continuación se muestran las expresiones XPath que utilizaremos para extraer diferentes datos financieros:
# Analizar el contenido HTML
parser = html.fromstring(response.content)
# Extracción de datos mediante 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]
# Imprimir los datos extraídos
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}")
Sitios web como Yahoo Finanzas suelen emplear medidas anti-bot para evitar el scraping automatizado. Para evitar que te bloqueen, puedes usar proxies y rotar las cabeceras.
Un servidor proxy actúa como intermediario entre tu máquina y el sitio web de destino. Ayuda a enmascarar tu dirección IP, haciendo más difícil que los sitios web detecten que estás haciendo scraping.
# Ejemplo de utilización de un proxy con modelo de autorización IP
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
Rotar la cabecera User-Agent es otra forma efectiva de evitar la detección. Puedes usar una lista de cadenas User-Agent comunes y seleccionar una al azar para cada petición.
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",
# Añada más cadenas User-Agent aquí
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Por último, puede guardar los datos raspados en un archivo CSV para su uso posterior. Esto es particularmente útil para almacenar grandes conjuntos de datos o analizar los datos fuera de línea.
import csv
# Datos que deben guardarse
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]
]
# Guardar en archivo 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")
A continuación se muestra el script completo en Python que integra todos los pasos que hemos comentado. Esto incluye el envío de peticiones con cabeceras, el uso de proxies, la extracción de datos con XPath y el guardado de los datos en un archivo CSV.
import requests
from lxml import html
import random
import csv
# Ejemplo de URL para raspar
url = "https://finance.yahoo.com/quote/AMZN/"
# Lista de cadenas User-Agent para cabeceras giratorias
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",
# Añada más cadenas User-Agent aquí
]
# Cabeceras para imitar un navegador real
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),
}
# Ejemplo de utilización de un proxy
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# Enviar la petición HTTP con cabeceras y proxies opcionales
response = requests.get(url, headers=headers, proxies=proxies)
# Comprobar si la solicitud se ha realizado correctamente
if response.status_code == 200:
# Analizar el contenido HTML
parser = html.fromstring(response.content)
# Extraer datos mediante 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]
# Imprimir los datos extraídos
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}")
# Guardar los datos en un archivo 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}")
El scraping de datos de Yahoo Finanzas utilizando Python es una forma potente de automatizar la recopilación de datos financieros. Mediante el uso de las bibliotecas requests y lxml, junto con las cabeceras, proxies y medidas anti-bot adecuadas, puede raspar y almacenar eficazmente datos bursátiles para su análisis. Esta guía cubre los aspectos básicos, pero recuerde que debe cumplir las directrices legales y éticas cuando realice scraping de sitios web.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0