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

Комментарии:

0 комментариев