Yahoo Finance предоставляет широкий спектр финансовой информации, включая цены на акции, и рыночные тенденции. Извлечение данных позволяет проводить анализ рынка в реальном времени, строить финансовые модели и автоматизировать сбор данных для инвестиционных стратегий.
Руководство покажет, как извлекать данные с Yahoo Finance с помощью Python, основываясь на библиотеках requests и lxml. Процесс включает отправку HTTP-запросов на веб-страницу, парсинг HTML-контента и извлечение необходимой информации через XPath.
Для работы с веб-скрапингом Yahoo Finance необходимо использовать следующие библиотеки Python:
Прежде чем приступить к работе, следует установить эти библиотеки:
pip install requests
pip install lxml
Далее будет рассмотрен процесс парсинга пошагово с примерами кода для наглядности и удобства.
Первый шаг в процессе веб-скрапинга включает отправку HTTP-запроса на целевой URL. Для выполнения этой задачи используется библиотека requests. Включение корректных заголовков в запрос является критически важным, поскольку это помогает имитировать поведение настоящего браузера, обходя базовые системы защиты против ботов.
import requests
from lxml import html
# Целевой URL
url = "Ссылка HTTPS"
# Заголовки для имитации реального браузера
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',
}
# Отправка HTTP-запроса
response = requests.get(url, headers=headers)
После получения HTML-содержимого следует этап извлечения необходимых данных, используя XPath. XPath представляет собой язык запросов для выбора узлов из XML-документа, что делает его идеальным инструментом для анализа HTML-контента.
Название и цена:
Дополнительные сведения:
Ниже приведены выражения XPath, которые мы будем использовать для извлечения различных финансовых данных:
# Парсинг HTML-содержимого
parser = html.fromstring(response.content)
# Извлечение данных с помощью 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]
# Вывод извлеченных данных
print(f"Название: {title}")
print(f"Текущая цена: {live_price}")
print(f"Дата и время: {date_time}")
print(f"Цена открытия: {open_price}")
print(f"Цена закрытия предыдущей сессии: {previous_close}")
print(f"Диапазон дня: {days_range}")
print(f"Диапазон 52 недель: {week_52_range}")
print(f"Объем: {volume}")
print(f"Средний объем: {avg_volume}")
Сайты, подобные Yahoo Finance, применяют меры против автоматизации для препятствия веб-скрапингу. Для обхода блокировок полезно использовать прокси и менять заголовки.
Прокси-сервер служит посредником между устройством и целевым сайтом, что позволяет скрыть IP-адрес и усложнить сайтам определение скрапинга.
# Пример использования прокси с авторизацией по IP-адресу
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
Меняя заголовок User-Agent, можно уменьшить вероятность обнаружения. Оптимальный вариант — использовать список распространенных строк User-Agent, выбирая из него случайным образом для каждого запроса.
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",
# Добавьте сюда больше строк User-Agent при необходимости
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Собранные данные удобно сохранять в формате CSV, что облегчает управление большими массивами информации и позволяет анализировать их.
import 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]
]
# Сохранение в файл 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")
Ниже представлен полный скрипт Python, который объединяет все описанные ранее этапы. Скрипт настраивает запросы с использованием специальных заголовков, применяет прокси для обхода ограничений, извлекает данные с использованием XPath и сохраняет результаты в файл формата CSV.
import requests
from lxml import html
import random
import csv
# Пример URL-ссылки для скрапинга
url = "Cсылка HTTPS"
# Список строк User-Agent для ротации заголовков
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",
# Добавьте сюда больше строк User-Agent при необходимости
]
# Заголовки для имитации реального браузера
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),
}
# Пример использования прокси
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# Отправка HTTP запроса с заголовками и прокси
response = requests.get(url, headers=headers, proxies=proxies)
# Проверка успешности запроса
if response.status_code == 200:
# Парсинг HTML содержимого
parser = html.fromstring(response.content)
# Извлечение данных с помощью 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]
# Вывод извлеченных данных
print(f"Название: {title}")
print(f"Текущая цена: {live_price}")
print(f"Дата и время: {date_time}")
print(f"Цена открытия: {open_price}")
print(f"Цена закрытия предыдущей сессии: {previous_close}")
print(f"Диапазон дня: {days_range}")
print(f"Диапазон 52 недель: {week_52_range}")
print(f"Объем: {volume}")
print(f"Средний объем: {avg_volume}")
# Сохранение данных в файл 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}")
Парсинг данных с Yahoo Finance с использованием Python предоставляет мощный инструмент для автоматизации сбора финансовой информации. Применение библиотек requests и lxml, в сочетании с заголовками, прокси и мерами противодействия ботам, позволяет эффективно собирать и сохранять финансовые данные для дальнейшего анализа. Хотя это руководство представляет базовые концепции, важно учитывать юридические и этические аспекты при парсинге веб-сайтов.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Комментарии: 0