1. Praca z pogodowym API
Skoro już opanowaliśmy podstawy, rozważmy realistyczny scenariusz. Wyobraź sobie, że musimy zbierać dane o pogodzie co 30 minut. Do tego wykorzystamy API dostarczające dane pogodowe. Oczywiście w celach edukacyjnych korzystanie z prawdziwego API może być ograniczone, więc załóżmy, jak by to mogło wyglądać.
Pobieranie obecnej pogody przez OpenWeather API
Ten przykład pokazuje, jak za pomocą requests pobrać dane o pogodzie w konkretnym mieście, wykorzystując API OpenWeather.
import schedule
import time
import requests
def fetch_weather(city):
api_key = "YOUR_API_KEY" # Zamień na swój API-klucz 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"Obecna temperatura w {city}: {temperature}°C")
print(f"Opis pogody: {weather_description}")
except requests.exceptions.RequestException as e:
print(f"Błąd podczas pobierania danych o pogodzie: {e}")
def fetch_weather_of_london():
fetch_weather("London")
# Konfiguracja zadania do wykonania co 30 minut
schedule.every(30).minutes.do(fetch_weather_of_london)
while True:
schedule.run_pending()
time.sleep(1)
Tutaj wysyłamy zapytanie GET do API OpenWeather, aby uzyskać bieżącą pogodę dla podanego miasta. W odpowiedzi JSON wyodrębniamy temperaturę i opis pogody, które wyświetlamy na ekranie. Nie zapomnij zamienić YOUR_API_KEY na swój klucz API.
Pobieranie bieżącego kursu walut z API
W tym przykładzie użyjemy requests do pobrania bieżącego kursu walut przez 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() # Sprawdzenie pomyślności wykonania zapytania
data = response.json()
usd_to_eur = data["rates"]["EUR"]
print(f"Bieżący kurs USD do EUR: {usd_to_eur}")
except requests.exceptions.RequestException as e:
print(f"Wystąpił błąd podczas pobierania danych: {e}")
# Konfiguracja zadania do wykonania co 10 minut
schedule.every(10).minutes.do(fetch_exchange_rate)
while True:
schedule.run_pending()
time.sleep(1)
Tutaj wysyłamy zapytanie GET do API kursu walut i otrzymujemy dane w formacie JSON. Kurs USD do EUR wyodrębniamy z odpowiedzi JSON i wyświetlamy na ekranie. Ten skrypt można dostosować do zbierania danych innych par walutowych, zmieniając klucz w data["rates"].
Z pomocą tego skryptu możemy stale zbierać dane o pogodzie i walutach. Dobry początek, prawda?
Rzeczywiste scenariusze użycia
Automatyzacja zbierania danych może być przydatna w różnych scenariuszach:
- Monitorowanie stanu serwerów: Automatyczne sprawdzenia stanu serwera mogą wykryć i ostrzec o problemach zanim się pojawią.
- Zbieranie danych o mediach społecznościowych: Ciągła analiza trendów i wzmiankowań marek.
- Śledzenie kursów walut: Zmiany kursów walut mogą być przydatne dla biznesu lub potrzeb osobistych.
2. Przykład zautomatyzowanego zbierania danych z sieci
Co, jeśli chcemy zbierać dane ze strony internetowej? Załóżmy, że regularnie sprawdzamy dostępność wiadomości. Do tego przyda się BeautifulSoup i requests.
Zbieranie danych ze strony internetowej
Załóżmy, że mamy stronę, z której chcemy zbierać nagłówki wiadomości. Oto jak możemy to zrobić:
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)
W tym przykładzie widać, że co 60 minut nasz skrypt sprawdza stronę internetową i wyświetla nagłówki wiadomości. Ułatwia to proces uzyskiwania aktualnych informacji.
Zbieranie nagłówków wiadomości z witryny
W tym przykładzie użyjemy requests do załadowania HTML strony i BeautifulSoup do parsowania nagłówków wiadomości.
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') # Szukanie wszystkich tagów <h3> (gdzie zwykle są nagłówki)
print("Ostatnie nagłówki wiadomości na BBC:")
for headline in headlines[:5]: # Pobieramy pierwsze 5 nagłówków
print("-", headline.get_text(strip=True))
except requests.exceptions.RequestException as e:
print(f"Błąd podczas pobierania danych: {e}")
fetch_news_headlines()
Tutaj ładujemy stronę BBC News i za pomocą BeautifulSoup szukamy wszystkich tagów <h3>, gdzie są nagłówki wiadomości. Wyświetlamy pierwsze 5 nagłówków, usuwając zbędne spacje i symbole za pomocą strip=True.
Zbieranie danych o cenach produktów ze sklepu internetowego
Ten przykład pokazuje, jak wydobywać dane o cenach produktów ze strony sklepu internetowego (np. Amazonu lub innego sklepu). Używamy requests do zapytania strony i BeautifulSoup do parsowania cen.
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"Produkt: {product_name}")
print(f"Cena: {price} zł")
except requests.exceptions.RequestException as e:
print(f"Błąd podczas pobierania danych: {e}")
except AttributeError:
print("Nie udało się znaleźć informacji o produkcie lub cenie")
# Przykładowy link do produktu
fetch_product_price("https://www.amazon.com/dp/B08N5WRWNW")
W tym przykładzie wysyłamy zapytanie GET z nagłówkiem User-Agent, aby uniknąć blokad. Następnie, używając BeautifulSoup, szukamy nazwy produktu według id="productTitle" i ceny produktu według klasy a-price-whole. Używamy strip=True do usuwania zbędnych spacji.
GO TO FULL VERSION