APIの活用は、プログラミングにおいて重要なスキルの一つです。前回の記事「【プログラミング】ChatGPTと進めるAPI学習の基本」では、APIの基礎について学びました。今回は、さらに一歩進んで、ChatGPTとPythonを使ってAPIから複数ページにわたるデータ収集やエラーハンドリング、そして自動化までを行う方法を解説します。このステップでは、より高度なデータ処理技術を身につけ、実際のプロジェクトに活用できるスキルを養っていきましょう。
Pythonの始め方についてはこちらの記事を参考にしてみてください!!
参考記事
ブログ内のコードはコピーして使用できます
APIとは何か?
APIは「Application Programming Interface」の略です。簡単に言うと、APIはコンピュータプログラム同士が話すためのルールです。
APIをカフェでの注文に例えてみましょう
- あなた(ユーザー): レストランのお客さん
- キッチン(サービス): 食べ物を作る場所
- ウェイター(API): あなたとキッチンをつなぐ人
レストランで食事を注文する時、あなたはウェイターに「パスタをください」と伝えます。ウェイターはそのメッセージをキッチンに伝え、キッチンでパスタが作られます。パスタができたら、ウェイターはそれをあなたに届けます。
APIはこの「ウェイター」のような役割を果たします。
- あなた(プログラム)はAPIを通じて他のプログラム(サービス)に何かをお願いしたり、情報を取り出したりします。
- APIはそのお願いを受け取って、必要な情報を持ってきたり、指示を実行したりします。
関連記事
APIを使った高度なデータ処理
目標
Hacker News APIを使用して、より複雑なデータ収集や処理を行います。具体的には、複数ページにわたるデータの収集、エラーハンドリング、データの自動化について学びます。
複数ページにわたるデータ収集
Hacker News APIは、基本的には単一ページで完結するデータを返しますが、特定のリクエストで複数のIDを取得し、それを基に詳細なデータを取得することが可能です。
Hacker Newsのトップストーリーを収集
まずは、トップストーリーのIDを取得し、それぞれのストーリーの詳細データを収集する方法を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import requests # Hacker News APIのトップストーリーのエンドポイント top_stories_url = 'https://hacker-news.firebaseio.com/v0/topstories.json' # トップストーリーのIDを取得 response = requests.get(top_stories_url) story_ids = response.json() # 詳細データを取得するためのリスト all_data = [] # 例として最初の10件のストーリーのデータを取得 for story_id in story_ids[:10]: story_url = f'https://hacker-news.firebaseio.com/v0/item/{story_id}.json' story_response = requests.get(story_url) if story_response.status_code == 200: story_data = story_response.json() all_data.append(story_data) else: print(f"エラーが発生しました: ストーリーID {story_id}") print(f"取得したデータ数: {len(all_data)}") for story in all_data: print(f"タイトル: {story.get('title')}, URL: {story.get('url')}") |
出力
1 2 3 4 5 6 7 8 9 10 11 |
取得したデータ数: 10 タイトル: Adding 16 KB Page Size to Android, URL: https://android-developers.googleblog.com/2024/08/adding-16-kb-page-size-to-android.html タイトル: SurrealEngine: Open-source reimplementation of Unreal Engine with playable UT99, URL: https://github.com/dpjudas/SurrealEngine タイトル: Launch HN: Moonglow (YC S24) – Serverless Jupyter Notebooks, URL: None タイトル: Vega – A declarative language for interactive visualization designs, URL: https://vega.github.io/vega/ タイトル: Playing Sudoku in TypeScript while the type checker highlights mistakes, URL: https://github.com/gruhn/typescript-sudoku タイトル: My IRC client runs on Kubernetes, URL: https://xeiaso.net/blog/2024/k8s-irc-client/ タイトル: We need to liberate the Postcode Address File, URL: https://takes.jamesomalley.co.uk/p/secret-paf-report タイトル: Cautionary tale on using Chase bank for indie business, URL: https://jxnl.co/writing/2024/09/21/chase-bank-small-business-nightmare/ タイトル: Nanolog supports logging with 7 ns median latency, URL: https://github.com/PlatformLab/NanoLog タイトル: 17-Year-Old Student Exposes Germany's 'Secret' Pirate Site Blocklist, URL: https://torrentfreak.com/17-year-old-student-exposes-germanys-secret-pirate-site-blocklist-240822/ |
エラーハンドリング
APIリクエストを行う際、ネットワークの問題やAPIの制限でエラーが発生することがあります。そのようなエラーに対処するための基本的なエラーハンドリングを導入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import requests def fetch_story_data(story_id): try: story_url = f'https://hacker-news.firebaseio.com/v0/item/{story_id}.json' response = requests.get(story_url, timeout=5) response.raise_for_status() return response.json() except requests.exceptions.HTTPError as errh: print(f"HTTPエラーが発生しました: {errh}") except requests.exceptions.ConnectionError as errc: print(f"接続エラーが発生しました: {errc}") except requests.exceptions.Timeout as errt: print(f"タイムアウトエラーが発生しました: {errt}") except requests.exceptions.RequestException as err: print(f"リクエストエラーが発生しました: {err}") return None # エラーハンドリングを加えたストーリーのデータ取得 all_data = [fetch_story_data(story_id) for story_id in story_ids[:10] if fetch_story_data(story_id)] print(f"取得したデータ数: {len(all_data)}") |
データ収集の自動化
このスクリプトを定期的に実行し、新しいストーリーを自動的に収集・保存するためのスクリプトを作成します。ここでは、time.sleep()
を使って一定時間ごとにデータを収集します。
使用するライブラリ
1. import requests
- 役割:
requests
は、PythonでHTTPリクエストを送信するためのライブラリです。ウェブサイトやAPIからデータを取得するために使用します。 - 用途: このコードでは、Hacker News APIにリクエストを送信して、ストーリーのデータを取得するために使われています。
requests.get()
メソッドを使用して、指定したURLからデータを取得します。
2. import time
- 役割:
time
は、Pythonで時間に関連する操作を行うための標準ライブラリです。プログラムの実行を一定時間停止したり、現在の時間を取得したりすることができます。 - 用途: このコードでは、
time.sleep(3600)
を使用して、プログラムの実行を1時間(3600秒)停止させています。これにより、定期的にデータを収集する機能を実現しています。
3. import json
- 役割:
json
は、PythonでJSON(JavaScript Object Notation)データを操作するための標準ライブラリです。JSONは、ウェブAPIやデータ交換でよく使われる軽量のデータフォーマットです。 - 用途: このコードでは、APIから取得したデータをJSON形式で保存したり、ファイルから読み込んだりするために使われています。
json.dump()
でPythonのデータをJSONファイルに保存し、json.load()
でファイルからデータを読み込むことができます。
自動的にデータを取得してJOSNファイルへ保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import requests import time import json # Hacker News APIのトップストーリーのエンドポイント top_stories_url = 'https://hacker-news.firebaseio.com/v0/topstories.json' def fetch_story_data(story_id): try: story_url = f'https://hacker-news.firebaseio.com/v0/item/{story_id}.json' response = requests.get(story_url, timeout=5) response.raise_for_status() return response.json() except requests.exceptions.HTTPError as errh: print(f"HTTPエラーが発生しました: {errh}") except requests.exceptions.ConnectionError as errc: print(f"接続エラーが発生しました: {errc}") except requests.exceptions.Timeout as errt: print(f"タイムアウトエラーが発生しました: {errt}") except requests.exceptions.RequestException as err: print(f"リクエストエラーが発生しました: {err}") return None # 定期的にデータを収集し、ファイルに保存 try: while True: # トップストーリーのIDを取得 response = requests.get(top_stories_url) story_ids = response.json() with open('hn_top_stories.json', 'w', encoding='utf-8') as file: top_stories = [fetch_story_data(story_id) for story_id in story_ids[:10] if fetch_story_data(story_id)] if top_stories: json.dump(top_stories, file, ensure_ascii=False, indent=2) print("データが保存されました。") time.sleep(3600) # 1時間ごとにデータを収集 except KeyboardInterrupt: print("プログラムが停止されました。") |
出力
JSONファイルへ保存する目的
JSONファイルは、データを効率的に管理・保存するためのフォーマットとして広く利用されています。特にプログラミングやデータ解析の分野では、シンプルで読みやすい形式が重宝され、構造化されたデータの保存や交換に最適です。このリード文では、JSONファイルの利便性と、その保存方法を解説します。特に、プログラマーやデータサイエンティストが日々の作業に役立つ情報を提供し、データ管理のスキルを向上させることを目的としています。JSONファイルを使いこなすことで、効率的なデータ処理と整理が可能になり、作業の生産性が大きく向上するでしょう。
1. JSON形式の特長
- 構造化データの保存: JSON(JavaScript Object Notation)は、データをキーと値のペアで保存する構造化されたデータフォーマットです。これにより、複雑なデータ(例えば、リストや辞書、ネストされたデータ構造など)をそのまま保存できます。
- 人間が読みやすい: JSONはシンプルなテキスト形式で、インデントや改行があり、人間が読みやすく、デバッグしやすいという特徴があります。
- プログラム間のデータ交換に適している: JSONはウェブAPIなどで広く使われており、異なるプログラム間でデータをやり取りするための標準的な形式となっています。多くの言語やツールがJSONをサポートしています。
2. JSONを選ぶ理由
- データの構造保持:
Hacker News
のストーリーデータは、タイトル、URL、スコア、コメントなどの多様な情報を含んでいます。これらのデータをそのまま保存し、再利用するには、JSONが適しています。例えば、辞書のリストとして保存する場合、各ストーリーのすべての属性を簡単に保存・取得できます。 - ネストされたデータの扱い: ストーリーに関連するデータがネストされた構造(例: コメントやメタデータなど)である場合、JSONはそれを自然に表現できるため、他の形式よりも適しています。
3. 他の形式と比較して
- テキストファイル(
txt
):txt
ファイルは非常にシンプルですが、データが単なるテキスト列として保存されるため、構造化されたデータを扱うのには向いていません。複雑なデータをテキストとして保存すると、後からプログラムで利用する際にデータを解析するのが難しくなります。 - CSVファイル(
CSV
):CSV
は表形式のデータ(行と列)に適していますが、ネストされたデータや複雑なデータ構造には不向きです。また、CSV
ではデータの各フィールドに名前を付けることが難しいため、データの理解や操作が複雑になります。
4. JSONの使用例
- APIとの連携: 多くのウェブAPIはJSON形式でデータを返します。そのため、データをそのまま保存・利用するのに最も自然な選択がJSONです。取得したデータを保存し、後で再利用する場合、JSONで保存しておけば、再びAPIを呼び出す必要がなくなり効率的です。
- データの再利用: 保存したJSONデータは、後で他のプログラムやスクリプトで簡単に読み込み、解析、表示することができます。例えば、保存したストーリーデータを使って統計情報を計算したり、特定の条件に合致するストーリーだけをフィルタリングする場合にも便利です。
まとめ
今回の記事では、APIの基本をさらに一歩進め、PythonとChatGPTを活用した高度なデータ収集と自動化の手法について解説しました。具体的には、Hacker News APIを使って複数ページにわたるデータを収集する方法や、エラーハンドリングを導入してプログラムの安定性を向上させる方法を学びました。また、定期的にデータを自動的に取得し、JSONファイルに保存する方法を紹介しました。
これらのスキルは、実際のプロジェクトに応用できる非常に重要な技術です。APIを使ったデータ収集は、ウェブスクレイピングと比較して効率的で安全な手法であり、適切にエラーハンドリングを行うことで、より信頼性の高いプログラムを作成できます。
さらに、JSON形式でデータを保存することで、データの再利用や解析が容易になります。これにより、日々の作業効率を大幅に向上させることが可能です。
Pythonを学びたい方はこちらの記事を参考にしてみてください
関連記事
プログラミング学習を進めているけれど、まだ副収入につなげられていない…そんなあなたへ!今こそ、学んだスキルを活かして副業に挑戦する絶好のチャンスです。プログラミングだけでなく、自分のスキルや商品をネットで販売する『ネットショップ』を開設してみませんか?
ネットショップを持つことで、自分の知識やスキルをより多くの人に届け、副収入を得ることが可能です。学んできたプログラミングを活かして、ショップのカスタマイズや運営も自由自在に行えますし、もし商品作成が難しい場合でも、デジタル商品やサービス提供など、いろんな選択肢があります。
このステップで一歩踏み出せば、今学んでいることが副収入に直結し、自分の時間をより有効に使うことができるはずです!一緒にネットショップを開設し、副業の第一歩を踏み出しましょう!
タイトルテキスト
プログラミングを学びたいけど、どこから始めたらいいのか分からない、自分に合っているか不安…そんな悩みを持っている方におすすめしたいのが、 無料相談 サービスです!
この無料相談では、あなたの現状や目標に合わせて、最適な学習プランを一緒に考えてくれます。どんなスキルが必要なのか、どうやって学習を進めると効果的かを具体的にアドバイスしてもらえるので、無駄なく効率的にスタートを切ることができます。
さらに、プログラミング学習には同じ目標を持つ 仲間 がいること、そして頼りになる メンター の存在がとても大きな支えになります。独学ではどうしてもつまずきやすい部分も、メンターがあなたの成長に合わせて親身にサポートしてくれるので、安心して学びを進められます。
まずは 無料相談 で、あなたに合ったプランを見つけて、スキルアップへの第一歩を踏み出してみませんか?今なら、迷っている方でも気軽に相談できるチャンスです!