1. 天気APIを使った操作
基本を理解したところで、現実的なシナリオを見てみましょう。例えば、30分ごとに天気データを収集する必要があると仮定します。そのためには、天気データ取得用のAPIを使用します。学習目的のため、実際のAPIの利用が制限される場合もありますが、どのように動作するかを説明します。
OpenWeather APIを使用した現在の天気の取得
この例では、requests
を使用して、指定された都市の天気データをOpenWeather APIから取得する方法を示しています。
import schedule
import time
import requests
def fetch_weather(city):
api_key = "YOUR_API_KEY" # OpenWeatherのAPIキーをここに入力
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"{city}の現在の気温: {temperature}°C")
print(f"天気の説明: {weather_description}")
except requests.exceptions.RequestException as e:
print(f"天気データの取得中にエラーが発生しました: {e}")
def fetch_weather_of_london():
fetch_weather("London")
# 30分ごとにタスクを実行する設定
schedule.every(30).minutes.do(fetch_weather_of_london)
while True:
schedule.run_pending()
time.sleep(1)
ここでは、GETリクエストをOpenWeather APIに送信し、指定された都市の現在の天気を取得しています。JSONレスポンスから気温と天気の説明を取り出して表示します。YOUR_API_KEY
を自分のAPIキーに置き換えるのを忘れないでください。
為替レートをAPIで取得
この例では、requests
を使用して、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() # リクエストが成功したかどうか確認
data = response.json()
usd_to_eur = data["rates"]["EUR"]
print(f"現在のUSDからEURへの為替レート: {usd_to_eur}")
except requests.exceptions.RequestException as e:
print(f"データ取得中にエラーが発生しました: {e}")
# 10分ごとにタスクを実行する設定
schedule.every(10).minutes.do(fetch_exchange_rate)
while True:
schedule.run_pending()
time.sleep(1)
ここでは、為替レートAPIにGETリクエストを送信し、JSON形式のデータを取得します。JSONレスポンスからUSDからEURへのレートを取り出して表示します。このスクリプトは、data["rates"]
のキーを変更することで、他の通貨ペアのデータを収集するように適応できます。
このスクリプトを使用すると、天気データや為替レートデータを継続的に収集できます。いいスタートですよね?
実際のユースケース
データ収集の自動化はいろいろなシナリオで役立ちます:
- サーバー状態の監視: サーバー状態の自動チェックにより、問題が発生する前に検出して警告を出せます。
- SNSデータ収集: トレンドやブランドの言及を継続的に分析する。
- 為替レートの追跡: 為替レートの変更はビジネスや個人的な用途に役立ちます。
2. ウェブデータ収集の自動化例
ウェブページからデータを収集したい時はどうしますか?例えば、定期的にニュースの有無を確認する場合。BeautifulSoup
とrequests
が役立ちます。
ウェブページからのデータ収集
例えば、ニュースの見出しを収集したいウェブサイトがあるとしましょう。以下のようにできます:
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)
この例では、毎60分、スクリプトがウェブページをチェックし、ニュースの見出しを表示します。これにより、最新情報を簡単に取得できます。
ウェブサイトからニュースの見出しを収集
この例では、requests
を使用してHTMLページをロードし、BeautifulSoup
を使用してニュースの見出しを解析します。
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') # 全ての<h3>タグを検索(通常、見出しがある場所)
print("BBCの最新ニュース見出し:")
for headline in headlines[:5]: # 最初の5つの見出しを取る
print("-", headline.get_text(strip=True))
except requests.exceptions.RequestException as e:
print(f"データ取得中にエラーが発生しました: {e}")
fetch_news_headlines()
ここでは、BBC Newsページをロードし、BeautifulSoup
を使用してすべての<h3>
タグを探します。これはニュースの見出しがある場所です。最初の5つの見出しを表示します。余分な空白や文字を削除するためにstrip=True
を使用します。
オンラインショップの商品価格データ収集
この例では、(例えばAmazon等)オンラインショップのウェブサイトから商品価格データを抽出する方法を示します。requests
を使用してページをリクエストし、BeautifulSoup
を使用して価格を解析します。
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"商品名: {product_name}")
print(f"価格: {price}円")
except requests.exceptions.RequestException as e:
print(f"データ取得中にエラーが発生しました: {e}")
except AttributeError:
print("商品情報または価格を見つけることができませんでした")
# サンプル商品のリンク
fetch_product_price("https://www.amazon.com/dp/B08N5WRWNW")
この例では、User-Agent
ヘッダーを設定してブロックを避けるGETリクエストを送信します。その後、BeautifulSoup
を使用してid="productTitle"
で商品名を、クラスa-price-whole
で価格を探します。strip=True
を使用して余分な空白を削除します。
GO TO FULL VERSION