Збір даних Google Finance за допомогою Python

Коментарі: 0

Сучасні інвестори та аналітики активно використовують інформацію з Google Finance для отримання відповідних та точних фінансових даних. Цей ресурс є кращим для моніторингу акцій, індексів та тенденцій на ринку, що надає детальні дані про фінансові показники компаній. Python, завдяки своїм потужним бібліотекам для веб -Spraping, є ідеальним інструментом для цього завдання. Надалі ви дізнаєтесь, як використовувати Python для збору даних з Google Finance.

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

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

pip install requests
pip install lxml

Далі ми розглянемо крок -кроки процесу вилучення даних з Google Finance:

Крок 1: Розуміння структури HTML

Для збору даних з Google Finance нам потрібно визначити конкретні елементи HTML, що містять інформацію, яка нас цікавить:

  • Назва: Розташованa у //div[@class="zzDege"]/text();
  • Ціна: Розташована в //div[@class="YMlKec fxKbKc"]/text();
  • Дата: Розташована в //div[@class="ygUjEc"]/text().

Ці вирази XPath необхідні для навігації та вилучення відповідних даних із структури HTML сторінок фінансів Google.

Назва:

1.png

Ціна:

2.png

Дата:

3.png

Крок 2: Побудова скраперу

Під час налаштування скраперу важливо звернути увагу на кілька ключових аспектів, щоб забезпечити ефективність та безпеку збору даних.

Виконання запиту HTTP

Щоб отримати HTML-контрактор з веб-сайту Google Finance, ми будемо використовувати бібліотеку запитів. Це початковий крок, який дозволяє завантажувати сторінку, з якої будуть зняті дані.

Встановлення правильних заголовків

Правильне налаштування HTTP-Heads, зокрема, 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 Коментаріїв