Сбор данных с Google Finance с помощью Python

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

Современные инвесторы и аналитики активно используют информацию с Google Finance для получения актуальных и точных финансовых данных. Этот ресурс предпочтителен для мониторинга акций, индексов и рыночных тенденций, предоставляя подробные данные о финансовых показателях компаний. Python, благодаря своим мощным библиотекам для веб-скрапинга, является идеальным инструментом для этой задачи. В дальнейшем руководстве вы узнаете, как использовать Python для сбора данных с Google Finance.

Установка необходимых библиотек

Перед началом работы убедитесь, что на вашей системе установлен Python. Вам также потребуются библиотеки: requests для выполнения HTTP-запросов и lxml для парсинга HTML-контента веб-страниц. Для установки необходимых библиотек используйте следующие команды в командной строке:

pip install requests
pip install lxml

Далее рассмотрим пошагово процесс извлечения данных с Google Finance:

Шаг 1: Понимание структуры HTML

Для сбора данных с Google Finance нам нужно определить конкретные HTML-элементы, содержащие интересующую нас информацию:

  • Название: расположено в //div[@class="zzDege"]/text();
  • Цена: расположено в //div[@class="YMlKec fxKbKc"]/text();
  • Дата: расположено в //div[@class="ygUjEc"]/text().

Эти выражения XPath необходимы для навигации и извлечения соответствующих данных из HTML-структуры страниц Google Finance.

Название:

1.png

Цена:

2.png

Дата:

3.png

Шаг 2: Настройка скрапера

При настройке скрапера важно уделить внимание нескольким ключевым аспектам, чтобы обеспечить эффективность и безопасность сбора данных.

Выполнение HTTP-запроса

Для получения HTML-содержимого с сайта Google Finance, воспользуемся библиотекой requests. Это начальный шаг, позволяющий загрузить страницу, с которой будут извлекаться данные.

Настройка правильных заголовков

Правильная настройка HTTP-заголовков, в частности, User-Agent, крайне важна для успешного скрапинга. Это помогает имитировать запросы, выполняемые обычными пользователями, тем самым уменьшая риск распознавания скрипта как бота и его блокировки веб-ресурсом. Неправильные или отсутствующие заголовки могут привести к тому, что сервер отклонит ваш запрос или вернет неполные или некорректные данные.

import requests

# Определение заголовков для имитации посещения браузером и избежания блокировки сервером
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',  # Заголовок запроса "Do Not Track"
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    '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/126.0.0.0 Safari/537.36',
}

# Определение URL страницы Google Finance для BNP Paribas (тикер BNP) на бирже Euronext Paris (EPA)
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"

# Осуществление HTTP GET запроса на URL с указанными заголовками
response = requests.get(url, headers=headers)

Настройка прокси-сервера

При осуществлении веб-скрапинга данных с Google Finance использование прокси становится необходимым по следующим причинам:

  • Избегание блокировки IP: сайты как Google Finance часто ограничивают или блокируют доступ с IP-адресов, которые генерируют чрезмерное количество запросов за короткий промежуток времени. Использование прокси позволяет распределять запросы между различными IP-адресами, снижая вероятность обнаружения вашей активности и предотвращая блокировки.
  • Повышение анонимности: прокси-серверы обеспечивают дополнительный уровень анонимности, скрывая ваш настоящий IP-адрес и тем самым защищая вашу личную информацию при скрапинге данных.
# Определение настроек прокси
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Выполнение HTTP GET запроса к URL с указанными заголовками и прокси
response = requests.get(url, headers=headers, proxies=proxies)

Парсинг HTML с помощью lxml

После получения HTML-содержимого нам необходимо проанализировать его, используя библиотеку lxml. Это позволит нам выполнять навигацию по структуре HTML и извлекать необходимые данные.

Функция fromstring из модуля lxml.html импортируется для парсинга HTML-контента в объект Element. Метод fromstring анализирует response.text — исходный HTML с веб-страницы, полученный ранее, и возвращает объект Element, сохраняемый в переменной parser, представляющий корень разобранного HTML-дерева.

from lxml.html import fromstring

# Парсинг HTML-контента ответа с использованием метода fromstring библиотеки lxml
parser = fromstring(response.text)

Извлечение данных с помощью XPath

После того как HTML-контент был успешно преобразован в объект Element с помощью библиотеки lxml, мы можем использовать выражения XPath для извлечения конкретных данных из разобранного HTML-дерева. XPath позволяет точно адресовать нужные элементы на странице по их характеристикам, таким как атрибуты, классы или иерархическое положение.

# Список для хранения выходных данных
finance_data_list = []

# Извлечение названия финансового инструмента
title = parser.xpath('//div[@class="zzDege"]/text()')[0]

# Извлечение текущей цены акции
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]

# Извлечение даты
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]

# Создание словаря для хранения извлеченных данных
finance_data = {
    'title': title,
    'price': price,
    'date': date
}
# Добавление данных в список finance data list
finance_data_list.append(finance_data)

Обработка и хранение данных

Собранные данные можно дополнительно обработать или сохранить в структурированном формате, например, JSON:

Переменная output_file указывает имя файла JSON, в котором будут сохранены данные (finance_data.json). Выражение open(output_file, 'w') открывает файл в режиме записи, а json.dump(finance_data_list, f, indent=4) записывает список finance_data_list в файл с отступом в 4 пробела для удобства чтения.

# Сохранение списка finance_data_list в файл JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

Обработка исключений запросов

При веб-скрапинге крайне важно обрабатывать исключения запросов, чтобы обеспечить устойчивость и надежность вашего скрипта. Некоторые неудачные запросы могут быть вызваны различными причинами, включая сетевые проблемы, ошибки сервера или тайм-ауты. Использование библиотеки requests в Python позволяет эффективно управлять этими исключениями.

try:
    # Отправка GET-запроса по URL
    response = requests.get(url)

    # Вызов исключения HTTPError для плохих ответов (статус-коды 4xx или 5xx)
    response.raise_for_status()

except requests.exceptions.HTTPError as e:
    # Обработка HTTP ошибок (например, 404, 500 и т.д.)
    print(f"HTTP error occurred: {e}")

except requests.exceptions.RequestException as e:
    # Обработка любых других исключений, которые могут возникнуть во время запроса
    print(f"An error occurred: {e}")

В этом примере код в блоке try выполняет запрос и проверяет его статусный код. Если возникает ошибка, соответствующее исключение перехватывается и обрабатывается в одном из блоков except. Это гарантирует, что ваш скрипт сможет правильно реагировать на различные проблемы во время выполнения запросов, поддерживая при этом его функционирование.

Финальная версия кода

Интегрируем все элементы, чтобы создать функцию скрапера, которая извлекает, анализирует и получает данные из нескольких URL Google Finance:

import requests
from lxml.html import fromstring
import json
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Список URL для скрапинга
urls = [
    "https://www.google.com/finance/quote/BNP:EPA?hl=en",
    "https://www.google.com/finance/quote/SPY:NYSEARCA?hl=en",
    "https://www.google.com/finance/quote/SENSEX:INDEXBOM?hl=en"
]

# Заголовки для имитации посещения браузером
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="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    '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/126.0.0.0 Safari/537.36',
}

# Настройка прокси
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Список для хранения извлеченных данных
finance_data_list = []

# Итерация по каждому URL и скрапинг данных
for url in urls:
    try:
        # Отправка GET-запроса к URL
        response = requests.get(url, headers=headers, proxies=proxies, verify=False)
        
        # Проверка на наличие ошибок в ответе
        response.raise_for_status()
        
        # Парсинг HTML-контента ответа
        parser = fromstring(response.text)
        
        # Извлечение заголовка, цены и даты
        title = parser.xpath('//div[@class="zzDege"]/text()')[0]
        price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
        date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
        
        # Сохранение извлеченных данных в словаре
        finance_data = {
            'title': title,
            'price': price,
            'date': date
        }
        
        # Добавление словаря в список
        finance_data_list.append(finance_data)
    
    except requests.exceptions.HTTPError as e:
        # Обработка HTTP ошибок
        print(f"HTTP error occurred for URL {url}: {e}")
    except requests.exceptions.RequestException as e:
        # Обработка других возможных ошибок во время запроса
        print(f"An error occurred for URL {url}: {e}")

# Сохранение списка finance_data_list в файл JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

print(f"Scraped data saved to {output_file}")

Вывод:

4.png

Это руководство по сбору данных с Google Finance с помощью Python, библиотек lxml и requests создает прочную основу для разработки мощных инструментов сбора финансовых данных, которые могут быть применены для тщательного анализа рынка, мониторинга конкурентов, или принятия обоснованных инвестиционных решений.

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

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