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 = "Посилання 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