Посібник зі збору даних з Yahoo Finance з використанням Python

Коментарі: 0

Yahoo Finance надає широкий спектр фінансової інформації, включно з цінами на акції та ринковими тенденціями. Витяг даних дає змогу проводити аналіз ринку в реальному часі, будувати фінансові моделі та автоматизувати збір даних для інвестиційних стратегій.

Посібник покаже, як витягувати дані з Yahoo Finance за допомогою Python, ґрунтуючись на бібліотеках requests і lxml. Процес передбачає надсилання HTTP-запитів на веб-сторінку, парсинг HTML-контенту та вилучення необхідної інформації через XPath.

Встановлення необхідних бібліотек

Для роботи з веб-скрапінгом Yahoo Finance необхідно використовувати такі бібліотеки Python:

  • requests: дає змогу надсилати HTTP-запити на веб-сайт Yahoo Finance;
  • lxml: забезпечує розбір HTML-контенту та витяг даних за допомогою XPath.

Перш ніж приступити до роботи, слід встановити ці бібліотеки:


pip install requests
pip install  lxml

Покроковий процес скрапінгу з Python

Далі буде розглянуто процес парсингу покроково з прикладами коду для наочності та зручності.

Крок 1: Надсилання запиту

Перший крок у процесі веб-скрапінгу включає надсилання 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)

Крок 2: Витяг даних за допомогою XPath

Після отримання HTML-вмісту слідує етап вилучення необхідних даних, використовуючи XPath. XPath являє собою мову запитів для вибору вузлів з XML-документа, що робить його ідеальним інструментом для аналізу HTML-контенту.

Назва та ціна:

scraping.png

Додаткові відомості:

scraping2.png

Нижче наведено вирази 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}")

Крок 3: Застосування проксі та заголовків

Сайти, подібні до 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, можна зменшити ймовірність виявлення. Оптимальний варіант - використовувати список поширених рядків 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)

Крок 4: Збереження даних у файл CSV

Зібрані дані зручно зберігати у форматі 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, у поєднанні із заголовками, проксі та заходами протидії ботам, дає змогу ефективно збирати та зберігати фінансові дані для подальшого аналізу. Хоча цей посібник представляє базові концепції, важливо враховувати юридичні та етичні аспекти під час парсингу веб-сайтів.

Коментарії:

0 Коментаріїв