Guia para criar um localizador de preços de criptografia simples

Comentários: 0

O acompanhamento dos dados de preços das criptomoedas populares pode ser um desafio devido à sua elevada volatilidade. Realizar uma pesquisa minuciosa e estar preparado para capitalizar as oportunidades de lucro são essenciais quando se lida com criptomoedas. A obtenção de dados exactos sobre os preços pode, por vezes, ser difícil. As APIs são comumente usadas para esse fim, mas as assinaturas gratuitas geralmente vêm com limitações.

Exploraremos como obter periodicamente os preços atuais das 150 principais criptomoedas usando Python. Nosso rastreador de preços de criptomoedas reunirá os seguintes dados:

  • Nome da moeda;
  • Ticker;
  • Preço;
  • Percentagem de variação de preço em 24 horas.

Passo 1: Importando bibliotecas

O primeiro passo no nosso script Python é importar as bibliotecas necessárias. Usaremos as bibliotecas `requests` e `BeautifulSoup` para enviar requisições e extrair dados de arquivos HTML, respetivamente.

import requests
from bs4 import BeautifulSoup
import csv
import time
import random

Também usaremos `csv` para operações com arquivos CSV e `time` e `random` para controlar a frequência de atualizações de preços e a rotação de proxies, respetivamente.

Passo 2: Configurando proxies

Ao enviar solicitações sem um proxy premium, você pode encontrar respostas "Acesso negado".

Você pode configurar um proxy desta forma:

proxy = {
 "http": "http://Your_proxy_IP_Address:Your_proxy_port",
}
html = requests.get(url, proxies=proxy)

Para proxies autenticados, utilize o seguinte formato:

proxy = {
 "http": "http://username:password@Your_proxy_IP_Address:Your_proxy_port",
}
html = requests.get(url, proxies=proxy)

Lembre-se de substituir "Your_proxy_IP_Address" e "Your_proxy_port" pelo endereço real do proxy. Além disso, substitua o valor de "username" e "password" pelas suas credenciais.

Passo 3: Rotação de proxies

A rotação de proxies é uma técnica muito importante para raspar com sucesso sites modernos, pois eles geralmente bloqueiam ou restringem o acesso a bots e raspadores quando detectam várias solicitações do mesmo endereço IP. Para configurar a rotação de proxy, importe a biblioteca random.

Crie uma lista de proxies para rotação:

# Lista de procuradores
proxies = [ 
 "username:password@Your_proxy_IP_Address:Your_proxy_port1",
 "username:password@Your_proxy_IP_Address:Your_proxy_port2",
 "username:password@Your_proxy_IP_Address:Your_proxy_port3",
 "username:password@Your_proxy_IP_Address:Your_proxy_port4",
 "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

Continuando, definimos uma função get_proxy() para selecionar aleatoriamente um proxy da nossa lista para cada pedido.

# método para rodar os seus proxies
def get_proxy(): 
  # Escolha um proxy aleatório da lista
  proxy = random.choice(proxies) 
  return {
            "http": f'http://{proxy}',
            "https": f'http://{proxy}'
    }

Esta função retorna um dicionário com o proxy selecionado para o protocolo HTTP. Esta configuração ajuda-nos a aparecer como vários utilizadores orgânicos para o site que estamos a raspar, aumentando as nossas hipóteses de contornar as medidas anti-raspagem.

Passo 4: Obtendo e analisando nossos dados criptográficos

A função get_crypto_prices() extrai os preços das criptomoedas do Coindesk. Ela envia uma solicitação GET para o site usando a função requests.get(), com nossos proxies rotativos passados como um argumento. Passamos o texto da resposta e o analisador "html.parser" para o construtor BeautifulSoup.

def get_crypto_prices():
    url = "https://crypto.com/price"
    html = requests.get(url, proxies=get_proxy())
    soup = BeautifulSoup(html.text, "html.parser")

Passo 5: Compreender a estrutura do sítio

Antes de começarmos a extração de dados, precisamos entender a estrutura do site. Podemos usar as Ferramentas de Desenvolvedor do navegador para inspecionar o HTML da página da Web. Para aceder às Developer Tools, pode clicar com o botão direito do rato na página Web e selecionar "Inspecionar".

1.png

Em seguida, encontramos todos os contentores de preços na página utilizando a função find_all() do BeautifulSoup e o seletor CSS "tr", class_='css-1cxc880' e extraímos o nome da moeda, o ticker, o preço e a variação percentual de 24 horas para cada contentor. Esses dados são armazenados em um dicionário e, em seguida, anexados à lista de preços.

2.png

Extração do nome da moeda

Aqui, usamos row.find('p', class_='css-rkws3') para localizar o elemento 'p' com a classe "css-rkws3" . Em seguida, extraímos o texto e o armazenamos em uma variável "name".

3.png

coin_name_tag = row.find('p', class_='css-rkws3')
name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

Extraindo o ticker

Da mesma forma, usamos row.find("span", class_="css-1jj7b1a") para localizar o elemento span com a classe "css-1jj7b1a". O método get_text() extrai o conteúdo do texto, fornecendo-nos o ticker.

4.png

coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"

Extração do preço

Localizamos o elemento "div" com a classe "css-b1ilzc". O conteúdo do texto é então extraído e atribuído à variável preço. Usamos uma instrução condicional para lidar com casos em que o elemento pode não estar presente.

5.png

coin_price_tag = row.find('div', class_='css-b1ilzc')
price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

Extraindo a variação percentual

Da mesma forma, localizamos o elemento "p" com a classe "css-yyku61" para extrair a alteração percentual. O conteúdo do texto é removido e uma instrução condicional lida com a possível ausência.

6.png

coin_percentage_tag = row.find('p', class_='css-yyku61')
percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"

Juntando tudo, temos um loop for com o seguinte aspeto:

for row in price_rows:
        coin_name_tag = row.find('p', class_='css-rkws3')
        name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

        coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
        ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
        
        coin_price_tag = row.find('div', class_='css-b1ilzc')
        price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

        coin_percentage_tag = row.find('p', class_='css-yyku61')
        percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"
        
        prices.append({
            "Coin": name,
            "Ticker": ticker,
            "Price": price,
            "24hr-Percentage": percentage
        })
    
    return prices

Passo 6: Exportar dados para CSV

A função export_to_csv() é definida para exportar os dados extraídos para um ficheiro CSV. Utilizamos a biblioteca CSV para escrever os dados na lista de preços para o ficheiro CSV especificado.

 def export_to_csv(prices, filename="proxy_crypto_prices.csv"):
       with open(filename, "w", newline="") as file:
           fieldnames = ["Coin", "Ticker", "Price", "24hr-Percentage"]
           writer = csv.DictWriter(file, fieldnames=fieldnames)
           writer.writeheader()
           writer.writerows(prices)

Passo 7: Executando o rastreador

Na parte principal do nosso script, chamamos a função get_crypto_prices() para extrair os preços e export_to_csv() para exportá-los para um arquivo CSV. Esperamos então 5 minutos (300) antes de atualizar novamente os preços. Isso é feito em um loop infinito, de modo que os preços continuarão sendo atualizados a cada 5 minutos até que o programa seja interrompido.

if __name__ == "__main__":
       while True:
           prices = get_crypto_prices()
           export_to_csv(prices)
           print("Prices updated. Waiting for the next update...")
           time.sleep(300)  # Atualizar os preços de 5 em 5 minutos

Código completo

Aqui está o código completo que integrará todas as técnicas e etapas que cobrimos, fornecendo uma abordagem simplificada para construir um rastreador de preços de criptografia como fizemos neste projeto.

import requests
from bs4 import BeautifulSoup
import csv
import time
import random

# Lista de procuradores
proxies = [
     "username:password@Your_proxy_IP_Address:Your_proxy_port1",
     "username:password@Your_proxy_IP_Address:Your_proxy_port2",
     "username:password@Your_proxy_IP_Address:Your_proxy_port3",
     "username:password@Your_proxy_IP_Address:Your_proxy_port4",
     "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

# Método personalizado para rodar proxies
def get_proxy():
    # Escolha um proxy aleatório da lista
    proxy = random.choice(proxies)
    # Devolve um dicionário com o proxy para o protocolo http
    return {"http": f'http://{proxy}',
            "https": f'http://{proxy}'
          }


def get_crypto_prices():
    url = "https://crypto.com/price"
    html = requests.get(url, proxies=get_proxy())
    print(html.status_code)
    soup = BeautifulSoup(html.content, "html.parser")

    price_rows = soup.find_all('tr', class_='css-1cxc880')

    prices = []
    for row in price_rows:
        coin_name_tag = row.find('p', class_='css-rkws3')
        name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

        coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
        ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
        
        coin_price_tag = row.find('div', class_='css-b1ilzc')
        price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

        coin_percentage_tag = row.find('p', class_='css-yyku61')
        percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"
        
        prices.append({
            "Coin": name,
            "Ticker": ticker,
            "Price": price,
            "24hr-Percentage": percentage
        })
    
    return prices



def export_to_csv(prices, filename="proxy_crypto_prices.csv"):
    with open(filename, "w", newline="") as file:
        fieldnames = ["Coin", "Ticker", "Price", "24hr-Percentage"]
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        writer.writeheader()
        writer.writerows(prices)


if __name__ == "__main__":
    while True:
        prices = get_crypto_prices()
        export_to_csv(prices)
        print("Prices updated. Waiting for the next update...")
        time.sleep(300)  # Atualizar os preços de 5 em 5 minutos (ajustar conforme necessário)

Resultados

Os resultados do nosso rastreador de preços de criptografia são salvos em um arquivo CSV chamado "proxy_crypto_prices.csv", como visto abaixo:

7.jpg

A sintaxe simples do Python torna-o a escolha ideal para construir um localizador automático de preços de criptomoedas. Esta linguagem de programação facilita a adição de novas funcionalidades e a expansão das capacidades do rastreador. O exemplo fornecido demonstra como criar um scraper básico que pode atualizar automaticamente as taxas de criptomoeda em intervalos especificados, recolher dados através de um proxy e guardá-los num formato de fácil utilização.

Comentários:

0 Comentários