Pythonとrequestsの完全ガイド!あなたのスキルを10倍にする12の手法

ブルーの背景にPythonのロゴとrequestsの文字が描かれた画像Python
この記事は約18分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

今回の記事では、Pythonとrequestsライブラリの完全なガイドとなる情報を提供します。

初心者から上級者まで、Pythonとrequestsライブラリを使いこなすための全知識を得ることができます。

基本的な使い方から高度なテクニックまで、わかりやすい解説と具体的なサンプルコードを交えて解説します。

●Pythonとrequestsとは

まず、Pythonとrequestsについて基本的な知識を共有します。

○Pythonとは

Pythonは、汎用的で高水準のプログラミング言語です。

その簡潔で読みやすい文法は、他の言語と比べて学習しやすいと言われています。

PythonはWeb開発からデータ分析、機械学習など、幅広い用途に対応しています。

○requestsとは

requestsは、PythonでHTTPリクエストを送信するためのライブラリです。

GETやPOSTなど、HTTPメソッドを簡単に扱うことができます。

requestsはシンプルなAPIを提供しており、Pythonコミュニティから広く支持を受けています。

●Pythonとrequestsの基本的な使い方

続いて、Pythonとrequestsの基本的な使い方を解説します。

○ライブラリのインストール方法

Pythonとrequestsの組み合わせを利用するには、まずrequestsライブラリをインストールする必要があります。

Pythonのパッケージ管理ツールであるpipを使ってインストールすることが可能です。

このコードでは、pipを使ってrequestsライブラリをインストールするコードを紹介しています。

この例では、コマンドラインからpip install requestsを実行して、requestsライブラリをインストールしています。

pip install requests

このコードを実行すると、requestsライブラリがPython環境にインストールされます。

○GETリクエストの送信方法

requestsを用いて、最も基本的なHTTPリクエストであるGETリクエストを送る方法を見てみましょう。

このコードでは、requestsを使ってGETリクエストを送るコードを紹介しています。

この例では、requests.get関数を使ってHTTPリクエストを送信し、そのレスポンスを変数responseに格納しています。

import requests

url = 'http://example.com'
response = requests.get(url)
print(response.status_code)
print(response.text)

このコードを実行すると、指定したURLへGETリクエストを送信し、そのレスポンスのステータスコードと本文を表示します。

具体的な結果は対象となるURLの内容に依存します。

○POSTリクエストの送信方法

同様に、requestsを用いてPOSTリクエストを送る方法も見てみましょう。

このコードでは、requestsを使ってPOSTリクエストを送るコードを紹介しています。

この例では、requests.post関数を使ってHTTPリクエストを送信し、そのレスポンスを変数responseに格納しています。

import requests

url = 'http://example.com'
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=payload)
print(response.status_code)
print(response.text)

このコードを実行すると、指定したURLへPOSTリクエストを送信し、そのレスポンスのステータスコードと本文を表示します。

具体的な結果は対象となるURLと送信するデータの内容に依存します。

○レスポンスの解析方法

requestsを使ってHTTPリクエストを送信した後は、受け取ったレスポンスを解析することが必要です。

このコードでは、requestsのレスポンスオブジェクトの基本的な使い方を紹介しています。

この例では、レスポンスオブジェクトのstatus_codeプロパティでステータスコードを取得し、textプロパティでレスポンスの本文を取得しています。

import requests

url = 'http://example.com'
response = requests.get(url)
print('Status Code:', response.status_code)
print('Headers:', response.headers)
print('Content:', response.text)

このコードを実行すると、指定したURLへGETリクエストを送信し、そのレスポンスのステータスコード、ヘッダー、および本文を表示します。

具体的な結果は対象となるURLの内容に依存します。

これらの基本的な操作をマスターすれば、Pythonとrequestsを用いてWebサービスとコミュニケーションを取る基礎が身につきます。

しかし、実際のWeb開発ではさまざまなシチュエーションが存在します。

●Pythonとrequestsでよく行う操作

Pythonとrequestsライブラリを使用して、日常的に行われる操作を一緒に見ていきましょう。

APIからのデータ取得、フォーム送信の自動化、Webスクレイピングなどの操作を具体的なサンプルコードとともに解説します。

○サンプルコード1:APIからのデータ取得

まず最初に、Pythonとrequestsを使ってAPIからデータを取得する方法を見てみましょう。

APIからデータを取得するためには、通常GETリクエストを使用します。

下記のサンプルコードでは、Pythonのrequestsライブラリを用いて、公開されているAPIからデータを取得するコードを紹介しています。

この例では、’https://jsonplaceholder.typicode.com/posts’というURLのAPIからデータを取得し、得られたレスポンスの内容を表示しています。

import requests

url = 'https://jsonplaceholder.typicode.com/posts'
response = requests.get(url)

# レスポンスのステータスコードを出力
print(response.status_code)
# レスポンスの内容を出力
print(response.json())

このコードを実行すると、まずGETリクエストが指定したURLに送信されます。

そして、得られたレスポンスのステータスコードと内容が表示されます。

ステータスコードが200であれば、リクエストは成功しています。

次に、レスポンスの内容を.json()メソッドを使ってJSON形式で取得しています。

これにより、APIから得たデータをPythonの辞書として操作することができます。

○サンプルコード2:フォーム送信の自動化

次に、Pythonとrequestsを使ってWebフォームの送信を自動化する方法を見てみましょう。

フォーム送信の自動化は、ユーザーの代わりに情報を送信する場合や、大量の情報を一度に送信する場合などに便利です。

下記のサンプルコードでは、Pythonのrequestsライブラリを用いて、POSTリクエストを送信するコードを紹介しています。

この例では、’https://httpbin.org/post’というURLに対して、’username’と’password’というデータを持つPOSTリクエストを送信しています。

import requests

url = 'https://httpbin.org/post'
data = {'username': 'testuser', 'password': 'mypassword'}
response = requests.post(url, data=data)

print(response.status_code)
print(response.json())

このコードを実行すると、まずPOSTリクエストが指定したURLにデータとともに送信されます。

そして、得られたレスポンスのステータスコードと内容が表示されます。

この場合、送信されたデータはレスポンスの内容の一部として返されます。

○サンプルコード3:Webスクレイピング

最後に、Pythonとrequestsを使ってWebページから情報を取得する、いわゆるWebスクレイピングの方法を見てみましょう。

Webスクレイピングは、ウェブサイトから情報を収集する際に非常に役立ちます。

下記のサンプルコードでは、PythonのrequestsライブラリとBeautifulSoupライブラリを組み合わせて、Webページから情報を抽出するコードを紹介しています。

この例では、’https://example.com’というURLのWebページから全てのパラグラフ()要素のテキストを抽出しています。

import requests
from bs4 import BeautifulSoup

url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

paragraphs = soup.find_all('p')

for p in paragraphs:
    print(p.get_text())

このコードを実行すると、まずGETリクエストが指定したURLに送信され、そのレスポンスがBeautifulSoupオブジェクトに変換されます。

そして、find_allメソッドを使って全てのパラグラフ要素を取得し、それぞれのテキストを表示します。

●Pythonとrequestsでのエラーハンドリング

何事も問題なく進むことは少なく、特にネットワークを介した操作では、エラーが生じることもあります。

そこで、Pythonとrequestsで適切なエラーハンドリングを行うための手法を学びましょう。

まず、requestsはエラー時に特定の例外を送出します。

その例外をキャッチすることでエラーハンドリングを実現します。

主には次のような例外があります。

  1. requests.exceptions.RequestException: すべてのrequests例外の基底となる例外です。
  2. requests.exceptions.ConnectionError: ネットワーク問題などでリクエストが失敗したときに送出されます。
  3. requests.exceptions.Timeout: リクエストがタイムアウトした場合に送出されます。
  4. requests.exceptions.TooManyRedirects: リダイレクトが多すぎる場合に送出されます。

○サンプルコード4:エラーハンドリングの基本

基本的なエラーハンドリングの例を紹介します。

このコードでは「requests.get」を使って特定のURLからデータを取得するコードを紹介しています。

この例では、取得したいURLが存在しない場合や接続に失敗した場合にどういう反応をするかを見ることができます。

import requests

try:
    # 存在しないURLを指定
    response = requests.get('http://存在しないurl.com')
    response.raise_for_status()

except requests.exceptions.RequestException as e:
    # すべてのrequests例外をキャッチ
    print('RequestExceptionです:', e)

except requests.exceptions.ConnectionError as e:
    # リクエストが失敗したとき
    print('ConnectionErrorです:', e)

except requests.exceptions.Timeout as e:
    # タイムアウトのとき
    print('Timeoutです:', e)

except requests.exceptions.TooManyRedirects as e:
    # リダイレクトが多すぎるとき
    print('TooManyRedirectsです:', e)

このコードを実行すると、接続が存在しないURLを指定しているため、’ConnectionErrorです:’というメッセージと一緒にエラーの詳細が表示されます。

また、raise_for_status()メソッドを使うことで、HTTPエラーコード(4xx, 5xx)を受け取ったときにrequests.exceptions.HTTPErrorを送出します。

●Pythonとrequestsのカスタマイズ方法

Pythonとrequestsライブラリを使ったHTTPリクエストは、多くのカスタマイズが可能です。

これから取り上げるいくつかのテクニックを覚えておくことで、より効率的かつスマートにデータを取得できるようになります。

まず、セッション管理から見ていきましょう。

requestsでは、複数のリクエスト間で特定のパラメータを維持するためにセッションを使用できます。

これはログインが必要なサイトで作業する際などに非常に便利です。

○サンプルコード5:セッション管理

このコードでは、requests.Session()を使ってセッションを作成し、そのセッション上で連続したリクエストを行う例を紹介しています。

この例では、同じセッション内でのリクエストにより、クッキー情報が保持され続けます。

import requests

# セッションを開始
with requests.Session() as session:
    session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
    response = session.get('http://httpbin.org/cookies')

print(response.text)

このコードを実行すると、最初のGETリクエストでクッキー’sessioncookie’が設定され、次のリクエストでそのクッキー情報が引き継がれています。

その結果、2つ目のリクエストで取得したクッキー情報には最初のリクエストで設定した’sessioncookie’が含まれています。

○サンプルコード6:カスタムヘッダーの利用

このコードでは、リクエストにカスタムHTTPヘッダーを追加する方法を紹介しています。

この例では、’User-Agent’というヘッダーをカスタマイズしています。

import requests

url = 'http://httpbin.org/headers'
headers = {'User-Agent': 'my-app/0.0.1'}

response = requests.get(url, headers=headers)

print(response.json())

このコードを実行すると、指定したURLに対するレスポンスがJSON形式で表示されます。

その中に、自分が設定した’User-Agent’の情報が含まれています。

○サンプルコード7:プロキシの利用

このコードでは、requestsを使ってプロキシを経由するリクエストを送る方法を紹介しています。

この例では、httpとhttpsの両方のプロトコルでプロキシを設定しています。

import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

response = requests.get('http://httpbin.org/ip', proxies=proxies)

print(response.json())

このコードを実行すると、指定したプロキシを経由してIPアドレス情報を取得します。

実際にプロキシを経由したリクエストを送る際には、適切なプロキシアドレスとポート番号に書き換えてください。

●Pythonとrequestsの高度なテクニック

次に進む前に、あなたのPythonとrequestsに対する理解が深まったことを確認しましょう。

これから私たちは、Pythonとrequestsを使用した高度なテクニックについて詳しく見ていきます。

これらのテクニックは、大規模なプロジェクトや特定のニーズを満たすために役立ちます。

○サンプルコード8:ストリーミングダウンロード

データが大量にあり、一度にすべてをダウンロードするのが困難な場合、ストリーミングダウンロードが有用です。

次のコードは、requestsを使用してストリーミングダウンロードを行う例を表しています。

import requests

url = 'http://大きなファイルのURL'
response = requests.get(url, stream=True)

with open('ファイルパス', 'wb') as fd:
    for chunk in response.iter_content(chunk_size=1024):
        fd.write(chunk)

このコードでは、まず大きなファイルのURLを指定します。

その後、requests.get()メソッドを使い、引数streamにTrueを指定してストリーミングモードを有効にします。

その後、’wb’モードでファイルを開き、response.iter_content()メソッドを使ってダウンロードしたデータを1KBずつ読み込み、ファイルに書き込みます。

○サンプルコード9:非同期リクエスト

Webサイトから大量のデータを取得する必要がある場合、リクエストを非同期に行うことでパフォーマンスを向上させることができます。

次のコードは、requestsを使って非同期リクエストを行う例を表しています。

import requests
from concurrent.futures import ThreadPoolExecutor

def fetch_url(url):
    return requests.get(url)

urls = ['http://URL1', 'http://URL2', 'http://URL3', ...]

with ThreadPoolExecutor(max_workers=5) as executor:
    responses = executor.map(fetch_url, urls)

このコードでは、まずrequests.get()を行う関数fetch_url()を定義します。

次に、取得したいURLのリストを作成します。

最後に、concurrent.futuresのThreadPoolExecutorを使って非同期にリクエストを行います。

この例では、最大5つのスレッドを使って非同期にリクエストを行います。

○サンプルコード10:OAuth認証の利用

APIを利用する際、OAuth認証が必要なケースもあります。

次のコードは、requestsとrequests_oauthlibを使ってOAuth認証を行う例を表しています。

import requests
from requests_oauthlib import OAuth1

url = 'http://認証が必要なURL'
auth = OAuth1('クライアントキー', 'クライアントシークレット', 'トークン', 'トークンシークレット')

response = requests.get(url, auth=auth)

このコードでは、まず認証が必要なURLを指定します。

次に、requests_oauthlibのOAuth1クラスを使用して認証情報を生成します。

最後に、requests.get()メソッドのauth引数に認証情報を指定してリクエストを行います。

○サンプルコード11:レートリミットの管理

APIを利用する際、一定時間内のリクエスト回数が制限されている場合があります。

このようなレートリミットを管理するためには、次のようなコードが役立ちます。

import requests
import time

def fetch_url(url):
    response = requests.get(url)
    if response.status_code == 429:
        time.sleep(1)
        return fetch_url(url)
    else:
        return response

url = 'http://レート制限のあるURL'
response = fetch_url(url)

このコードでは、まずリクエストを行う関数fetch_url()を定義します。

この関数では、リクエストがレート制限に引っかかった場合(HTTPステータスコードが429の場合)、1秒待ってから同じリクエストを再試行します。

○サンプルコード12:レスポンスのキャッシュ

同じリクエストを何度も行う場合、レスポンスをキャッシュすることでパフォーマンスを向上させることができます。

次のコードは、requests_cacheを使ってレスポンスをキャッシュする例を表しています。

import requests
import requests_cache

requests_cache.install_cache('キャッシュ名')

response = requests.get('http://何度もアクセスするURL')

このコードでは、まずrequests_cacheをインポートし、requests_cache.install_cache()関数を使ってキャッシュを設定します。

その後、requests.get()メソッドを使用してリクエストを行います。

このとき、同じリクエストが既にキャッシュされている場合は、そのキャッシュされたレスポンスが返されます。

まとめ

この記事では、Pythonとrequestsを使用した基本的なHTTPリクエストの送信方法から、高度なテクニックまでを詳しく見てきました。

初心者から上級者まで、これらの知識を身につけることで、Pythonとrequestsを使いこなすスキルが飛躍的に向上することでしょう。

それぞれのテクニックについては、実際に手を動かして試すことで理解が深まります。

どんなに複雑な問題も、一つ一つの手法を組み合わせて解決していくことが可能です。

これからもPythonとrequestsを使って、あなたのプロジェクトやタスクを効率よく進めていきましょう。