CodeGym /Javaコース /Python SELF JA /定期的なデータ収集のための時間ベース自動化

定期的なデータ収集のための時間ベース自動化

Python SELF JA
レベル 40 , レッスン 1
使用可能

1. 天気APIを使った操作

基本を理解したところで、現実的なシナリオを見てみましょう。例えば、30分ごとに天気データを収集する必要があると仮定します。そのためには、天気データ取得用のAPIを使用します。学習目的のため、実際のAPIの利用が制限される場合もありますが、どのように動作するかを説明します。

OpenWeather APIを使用した現在の天気の取得

この例では、requestsを使用して、指定された都市の天気データをOpenWeather APIから取得する方法を示しています。

Python

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を通じて現在の為替レートを取得します。

Python

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. ウェブデータ収集の自動化例

ウェブページからデータを収集したい時はどうしますか?例えば、定期的にニュースの有無を確認する場合。BeautifulSouprequestsが役立ちます。

ウェブページからのデータ収集

例えば、ニュースの見出しを収集したいウェブサイトがあるとしましょう。以下のようにできます:

Python

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を使用してニュースの見出しを解析します。

Python

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を使用して価格を解析します。

Python

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を使用して余分な空白を削除します。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION