Como raspar dados do Google Finance com Python

Comentários: 0

Os investidores e analistas de hoje estão usando as informações de financiamento do Google, pois são atuais e precisas. O Google Finance parece ser o local mais preferido para ter dados financeiros atuais de todos os tipos, especialmente para ações, juntamente com índices e tendências de mercado, pois fornecem mais detalhes sobre as métricas financeiras das empresas. O Python é o melhor idioma para raspar a web. Esta postagem o ajudará a aprender a coletar dados do Google Finance, para que você possa ter todas as ferramentas de análise financeira necessárias.

Instalando as bibliotecas necessárias

Antes de começar, verifique se você está instalado no seu sistema. Você também precisará das bibliotecas: solicitações para fazer solicitações HTTP e LXML para analisar o conteúdo HTML das páginas da Web. Para instalar as bibliotecas necessárias, use os seguintes comandos na linha de comando:

pip install requests
pip install lxml

Em seguida, exploraremos o processo passo a passo de extrair dados do Google Finance:

Etapa 1: Compreendendo a estrutura HTML

Para raspar dados do Google Finance, precisamos identificar os elementos HTML específicos que contêm as informações em que estamos interessados:

  • Título: Localizado em //div[@class="zzDege"]/text()
  • Preço: encontrado em //div[@class="YMlKec fxKbKc"]/text()
  • Data: Localizado em //div[@class="ygUjEc"]/text()

Essas expressões XPath servirão como nosso guia para navegar e extrair os dados relevantes da estrutura HTML das páginas do Google Finance.

Título:

1.png

Preço:

2.png

Data:

3.png

Etapa 2: Configurando a função de raspador

Ao configurar um raspador, é crucial se concentrar em vários aspectos importantes para garantir a coleta de dados eficiente e segura.

Fazendo solicitação http

Para buscar conteúdo HTML no site do Google Finance, empregaremos a biblioteca de solicitações. Esta etapa inicia o processo carregando a página da web da qual pretendemos extrair dados.

Importância de usar cabeçalhos corretos para raspar

É realmente importante usar os cabeçalhos certos ao raspar a web, principalmente o cabeçalho agente do usuário. O uso de cabeçalhos é essencial para simular uma solicitação de navegador genuína que impedirá que o site identifique e interrompa seu script automático. Eles garantem que o servidor responda corretamente, fornecendo informações relevantes sobre a solicitação. Na ausência de cabeçalhos adequados, a solicitação pode ser negada ou o servidor pode retornar conteúdo completamente diferente ou entregar conteúdo em partes que podem restringir a atividade de raspagem da Web. Portanto, a configuração de cabeçalhos ajuda a manter o acesso ao site e garante que o raspador recupere os dados corretos.

import requests

# Defina os cabeçalhos para imitar uma visita ao navegador e evite ser bloqueado pelo servidor
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',  # Não rastreie o cabeçalho da solicitação
    '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',
}

# Defina o URL da página de finanças do Google para o BNP Paribas (Ticker BNP) no Euronext Paris (EPA) Exchange
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"

# Faça o http receber solicitação para o URL com os cabeçalhos especificados
response = requests.get(url, headers=headers)

Importância de usar proxies

Ao raspar o Google Finance ou qualquer site em escala, é crucial usar proxies. Aqui está o porquê:

  • Evite proibições de IP: sites como o Google Finance geralmente bloqueiam ou restringem o acesso de endereços IP que fazem muitas solicitações em um curto período. Os proxies ajudam a distribuir solicitações em vários endereços IP, reduzindo a chance de detecção e proibição.
  • Privacidade aprimorada: o uso de proxies adiciona uma camada de anonimato, protegendo sua identidade e intenções ao raspar dados.
# Defina as configurações de proxy
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Faça o http receber solicitação para o URL com os cabeçalhos e proxies especificados
response = requests.get(url, headers=headers, proxies=proxies)

Analisando html com lxml

Depois de buscar o conteúdo HTML, precisamos analisá -lo usando a biblioteca LXML. Isso nos permitirá navegar pela estrutura HTML e extrair os dados de que precisamos:

A função FromString do lxml.html é importada para analisar o conteúdo HTML em um objeto de elemento. O método do FromString analisa a resposta.Text, o HTML bruto da página da web buscada anteriormente e retorna um objeto de elemento armazenado na variável do analisador, representando a raiz da árvore HTML analisada.

from lxml.html import fromstring

# Analise o conteúdo HTML da resposta usando o método de String do LXML
parser = fromstring(response.text)

Extraindo dados com xpath

Agora, vamos extrair dados específicos usando expressões XPath da árvore HTML analisada:

O título recupera o título do instrumento financeiro do HTML analisado. O preço recupera o preço atual das ações. A data recupera a data. O dicionário Finance_Data contém o título, preço e data extraídos. Este dicionário é anexado a uma lista.

# Lista para armazenar dados de saída
finance_data_list = []

# Extraindo o título do instrumento financeiro
title = parser.xpath('//div[@class="zzDege"]/text()')[0]

# Extraindo o preço atual do estoque
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]

# Extraindo a data
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]

# Criando um dicionário para armazenar os dados extraídos
finance_data = {
    'title': title,
    'price': price,
    'date': date
}
# Anexando dados para FINANCE_DATA_LIST
finance_data_list.append(finance_data)

Manuseio e armazenamento de dados

Para lidar com os dados raspados, convém processá -los ou armazená -los em um formato estruturado como JSON:

A variável output_file especifica o nome do arquivo JSON, onde os dados serão salvos (FINANCE_DATA.JSON). O Open (output_file, 'W') abre o arquivo no modo de gravação, e JSON.DUMP (FINANCE_DATA_LIST, F, Indent = 4) grava o Finance_Data_List no arquivo com indentação de 4 espaço para legibilidade.

# Salvar Finance_Data_List em um arquivo JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

Manipulando exceções de solicitação

Ao raspar dados de sites, é importante lidar com exceções de solicitação, a fim de garantir a confiabilidade e a robustez do seu script de raspagem. Essas solicitações podem falhar por vários motivos, como problemas de rede, erros de servidor ou tempo limite. A biblioteca de solicitações em Python fornece uma maneira de lidar efetivamente a esses tipos de exceções, como mostrado abaixo:

try:
    # Enviando uma solicitação de get para o URL
    response = requests.get(url)

    # Levante um httperror para respostas ruins (códigos de status 4xx ou 5xx)
    response.raise_for_status()

except requests.exceptions.HTTPError as e:
    # Lidar com erros HTTP (como 404, 500, etc.)
    print(f"HTTP error occurred: {e}")

except requests.exceptions.RequestException as e:
    # Lidar com outras exceções que possam ocorrer durante o pedido
    print(f"An error occurred: {e}")

O bloco de tentativa envolve o código que pode aumentar as exceções. O requests.get (URL) envia uma solicitação GET. O Response.Raise_For_Status () verifica o código de status da resposta e aumenta um httperror para obter códigos malsucedidos. O exceto solicitações.Exceptions.httperror como e: captura exceções httperror e imprime a mensagem de erro. O exceto solicitações.Exceptions.RequestException como e: captura outras exceções (por exemplo, erros de rede, tempo limite) e imprime a mensagem de erro.

Código completo

Agora, vamos integrar tudo para criar nossa função de raspador que busca, analisa e extrai dados de vários URLs do 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()


# Lista de URLs para raspar
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"
]

# Defina cabeçalhos para imitar uma visita ao navegador
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',
}

# Definir terminal de proxy
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# Lista para armazenar dados raspados
finance_data_list = []

# Itera através de cada URL e raspar dados
for url in urls:
    try:
        # Enviando uma solicitação de get para o URL
        response = requests.get(url, headers=headers, proxies=proxies, verify=False)
        
        # Levante um httperror para respostas ruins (códigos de status 4xx ou 5xx)
        response.raise_for_status()
        
        # Analise o conteúdo HTML da resposta usando o método de String do LXML
        parser = fromstring(response.text)
        
        # Extraindo o título, preço e data
        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]
        
        # Armazenar dados extraídos em um dicionário
        finance_data = {
            'title': title,
            'price': price,
            'date': date
        }
        
        # Anexar o dicionário noto a lista
        finance_data_list.append(finance_data)
    
    except requests.exceptions.HTTPError as e:
        # Lidar com erros HTTP (como 404, 500, etc.)
        print(f"HTTP error occurred for URL {url}: {e}")
    except requests.exceptions.RequestException as e:
        # Lidar com outras exceções que possam ocorrer durante o pedido
        print(f"An error occurred for URL {url}: {e}")

# Salvar Finance_Data_List em um arquivo 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}")

Saída:

4.png

Este guia oferece um tutorial abrangente sobre a eliminação de dados do Google Finance usando o Python, juntamente com bibliotecas poderosas como `lxml` e` solicitações`. Ele estabelece as bases para a criação de ferramentas sofisticadas para raspagem de dados financeiros, que podem ser utilizados para realizar análises de mercado detalhadas, monitorar atividades de concorrentes ou apoiar as decisões de investimento informadas.

Comentários:

0 Comentários