1. Trabalhando com uma API de clima
Agora que já pegamos o básico, vamos dar uma olhada em um cenário realista. Imagine que precisamos coletar dados sobre o clima a cada 30 minutos. Para isso, usaremos uma API para obter dados meteorológicos. Claro, para fins de aprendizado, o uso de uma API real pode ter limitações, então vamos imaginar como isso poderia ser.
Obtendo o clima atual com a OpenWeather API
Este exemplo mostra como usar requests para obter dados do clima em uma cidade específica, usando a API OpenWeather.
import schedule
import time
import requests
def fetch_weather(city):
api_key = "YOUR_API_KEY" # Substitua pela sua chave de API do OpenWeather
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
temperature = data["main"]["temp"]
weather_description = data["weather"][0]["description"]
print(f"Temperatura atual em {city}: {temperature}°C")
print(f"Descrição do clima: {weather_description}")
except requests.exceptions.RequestException as e:
print(f"Erro ao obter dados meteorológicos: {e}")
def fetch_weather_of_london():
fetch_weather("London")
# Agendamento da tarefa a cada 30 minutos
schedule.every(30).minutes.do(fetch_weather_of_london)
while True:
schedule.run_pending()
time.sleep(1)
Aqui enviamos um GET request para a API OpenWeather para obter o clima atual de uma cidade específica. No JSON de resposta extraímos a temperatura e descrição do clima, que são exibidos na tela. Não se esqueça de substituir YOUR_API_KEY pela sua chave de API.
Obtendo a taxa de câmbio atual com uma API
Neste exemplo, usaremos requests para obter a taxa de câmbio atual via API.
import schedule
import time
import requests
def fetch_exchange_rate():
url = "https://api.exchangerate-api.com/v4/latest/USD"
try:
response = requests.get(url)
response.raise_for_status() # Verificar se a requisição foi bem-sucedida
data = response.json()
usd_to_eur = data["rates"]["EUR"]
print(f"Taxa de câmbio atual de USD para EUR: {usd_to_eur}")
except requests.exceptions.RequestException as e:
print(f"Ocorreu um erro ao obter os dados: {e}")
# Agendamento da tarefa a cada 10 minutos
schedule.every(10).minutes.do(fetch_exchange_rate)
while True:
schedule.run_pending()
time.sleep(1)
Aqui enviamos um GET request para a API de taxa de câmbio e obtemos os dados em formato JSON. O câmbio de USD para EUR é extraído da resposta JSON e exibido na tela. Esse script pode ser adaptado para coletar dados de outros pares de moedas, mudando a chave em data["rates"].
Com esse script, podemos coletar constantemente dados sobre clima e câmbio. Bem legal para começar, né?
Cenários reais de uso
Automatizar coleta de dados pode ser útil em vários casos:
- Monitoramento do estado de servidores: Verificações automáticas do estado do servidor podem identificar e alertar sobre problemas antes que eles ocorram.
- Coleta de dados de redes sociais: Análise constante de tendências e menções de marcas.
- Monitoramento de taxas de câmbio: Alterações na taxa de câmbio podem ser úteis para negócios ou demandas pessoais.
2. Exemplo de coleta automatizada de dados web
E se quisermos coletar dados de uma página da web? Por exemplo, verificar regularmente notícias novas. Para isso, entra em cena o BeautifulSoup e o requests.
Coleta de dados de uma página web
Suponha que temos um site do qual queremos coletar manchetes de notícias. É assim que podemos fazer isso:
import requests
from bs4 import BeautifulSoup
def fetch_news():
response = requests.get("http://example.com/news")
soup = BeautifulSoup(response.content, 'html.parser')
for headline in soup.find_all('h2', class_='news'):
print(headline.text)
schedule.every().hour.do(fetch_news)
while True:
schedule.run_pending()
time.sleep(1)
Nesse exemplo, podemos ver que a cada 60 minutos nosso script verificará a página da web e exibirá as manchetes das notícias. Isso simplifica o processo de obter informações atualizadas.
Coleta de manchetes de notícias de um site
Nesse exemplo, usaremos requests para carregar a página HTML e BeautifulSoup para analisar as manchetes.
import requests
from bs4 import BeautifulSoup
def fetch_news_headlines():
url = "https://www.bbc.com/news"
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
headlines = soup.find_all('h3') # Procurando todas as tags <h3> (onde geralmente estão as manchetes)
print("Últimas manchetes de notícias da BBC:")
for headline in headlines[:5]: # Pegando as primeiras 5 manchetes
print("-", headline.get_text(strip=True))
except requests.exceptions.RequestException as e:
print(f"Erro ao obter os dados: {e}")
fetch_news_headlines()
Aqui carregamos a página do BBC News e, com BeautifulSoup, procuramos todas as tags <h3>, onde estão as manchetes das notícias. Exibimos as primeiras 5 manchetes, removendo espaços extras e caracteres usando strip=True.
Coleta de dados de preços de produtos de uma loja online
Esse exemplo mostra como extrair dados de preços de produtos de um site de loja online (como a Amazon ou outra loja). Usamos requests para fazer a requisição à página e BeautifulSoup para analisar os preços.
import requests
from bs4 import BeautifulSoup
def fetch_product_price(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
product_name = soup.find('span', {'id': 'productTitle'}).get_text(strip=True)
price = soup.find('span', {'class': 'a-price-whole'}).get_text(strip=True)
print(f"Produto: {product_name}")
print(f"Preço: {price} R$")
except requests.exceptions.RequestException as e:
print(f"Erro ao obter os dados: {e}")
except AttributeError:
print("Não foi possível encontrar informações sobre o produto ou preço")
# Exemplo de link para o produto
fetch_product_price("https://www.amazon.com/dp/B08N5WRWNW")
Nesse exemplo, enviamos um GET request com um cabeçalho User-Agent para evitar bloqueios. Em seguida, usando BeautifulSoup, procuramos o nome do produto pelo seu id="productTitle" e o preço do produto pelo atributo de classe a-price-whole. Usamos strip=True para remover espaços extras.
GO TO FULL VERSION