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:
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.
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.
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.
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")
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".
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.
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".
coin_name_tag = row.find('p', class_='css-rkws3')
name = coin_name_tag.get_text() if coin_name_tag else "no name entry"
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.
coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
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.
coin_price_tag = row.find('div', class_='css-b1ilzc')
price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"
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.
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
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)
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
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)
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:
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentários: 0