6.1 なぜプロキシが必要なの?
今はどの国も独自のインターネットを持っている時代だね。 今は個々のユーザーではなく、ウェブサイト全体、ドメイン、アプリ、そして国までもがブロックされることがあるんだ。 それは良くない。だけど君がプログラマーなら大丈夫— インターネットにはたくさんのプロキシサーバーがあるからね...
プロキシサーバー(または単にプロキシ)は クライアント(例えば君のコンピュータ)とアクセスしようとしているサーバーの間の 仲介役を果たす中間サーバーなんだ。 プロキシサーバーはクライアントからのリクエストを受け取り、それをターゲットサーバーに転送し、応答を受け取ってクライアントに返す。
大きなプロジェクトには最低でもいくつかのプロキシサーバーがあって、さまざまな便利な機能を提供しているんだ。 例えばこんな感じ:
- 匿名化: プロキシサーバーは クライアントの本当のIPアドレスを隠して、インターネットリソースに匿名でアクセスすることを可能にするんだ。IPアドレスはネットワークの中でのデバイスのユニークな識別子で、 それを隠すことでユーザーのプライバシーを守ることができる。
- キャッシュ: プロキシサーバーは よくリクエストされるリソースをキャッシュして、アクセスを速くしたり ネットワークリソースの負荷を軽減できるんだ。例えば、たくさんのユーザーが同じウェブページをリクエストする場合、プロキシサーバーはそのコピーを保存して 毎回オリジナルサーバーにアクセスせずにそれを直接返すことができる。
- コンテンツフィルタ: プロキシサーバーは 特定のウェブサイトやコンテンツの種類へのアクセスをブロックして、 コントロールとセキュリティを提供する。
- アクセス制限の回避: プロキシサーバーは 地域的なコンテンツアクセス制限を回避するのを手助けして、 特定の地理的エリアでブロックされているリソースへのアクセスを提供する。
- ログ記録とモニタリング: プロキシサーバーは すべてのリクエストと応答をログに記録して、ネットワークトラフィックを追跡したり 分析することができる。
プロキシサーバーの仕組み
- クライアントがリクエストを送る: クライアントデバイス (例えばコンピュータやスマートフォン)がプロキシサーバーにリクエストを送信する。
- プロキシサーバーがリクエストを処理する: プロキシサーバーがそのリクエストを受け取り、(例えば ヘッダーを追加したり削除したりして)変更を加え、それをターゲットサーバーに転送する。
- ターゲットサーバーが応答する: ターゲットサーバーは リクエストを処理して、プロキシサーバーに応答を返す。
- プロキシサーバーがクライアントに応答を返す: プロキシサーバーはターゲットサーバーからの応答を受け取り、それを クライアントに転送する。
プロキシサーバーを利用するメリット
- セキュリティ向上: プロキシサーバーは 内部ネットワークを外部から隠すことで、攻撃のリスクを減少させる。
- アクセスの高速化: よくリクエストされるリソースのキャッシュが それらへのアクセス時間を短縮する。
- アクセス制御: プロキシサーバーは 特定のサイトやコンテンツ種類へのアクセスを制限して、 ネットワークの利用をコントロールする。
- ネットワーク負荷の軽減: キャッシュと トラフィックフィルタリングによって、プロキシサーバーは 全体のデータ転送量とネットワーク負荷を減少させることができる。
多くのサーバープログラムはセキュリティのために直接インターネットにアクセスしないようになっている。代わりにプロキシを通じてアクセスして、 そのプロキシには許可されたサイトやリソースのリストが既にある。だから キミのプログラムもプロキシと連携できるようにならなきゃね。
すべてのメリットがある一方で、プロキシサーバーを使うことにデメリットもあるかもね。 例えば、リクエストが追加のステップを経由するから接続速度が遅くなるかもしれないし、 一部のサイトは有名なプロキシサーバーからのアクセスをブロックすることもある。
6.2 プロキシとrequestsモジュール
requestsライブラリはproxiesパラメータでプロキシサーバーの使用をサポートしているんだ。
HTTP(Hypertext Transfer Protocol)とHTTPS(HTTP Secure)はインターネットでのデータ転送プロトコルだね。 HTTPSはHTTPのセキュアバージョンだよ。これらのプロトコルは、特にHTTPSの暗号化の特性のために、異なるプロキシサーバーが必要になることがあるんだ。
HTTPプロキシの使用例
プロキシは通常、1つではなくリストで渡されるんだ。 これって、いくつかのプロキシがバンされるか利用できなくなっても便利だからね。
requests.get()関数を使って、proxy経由でリクエストを送信する例だよ。
import requests
# リクエストするURLアドレス
url = 'http://httpbin.org/ip'
# プロキシサーバーの設定
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', }
# プロキシ経由でGETリクエストを送信
response = requests.get(url, proxies=proxies)
print(response.json())
httpリクエストは最初のプロキシサーバーを通り、httpsは 2番目のプロキシサーバーを通るんだ。
認証付きプロキシの使用例
多くのプロキシサーバーは最初に認証が必要で、それを通過した後に利用可能になるんだ。そんな時は面白いものが役立つよ…
URLが最初に考案されたとき、URLの中にリソースへのログインとパスワードを直接渡せるようになっていたんだ。こんな感じでね:
http://user:password@domain/path
だから、プロキシサーバーが認証を要求するなら、URLに 資格情報を含めることができるよ。
例だよ:
import requests
# リクエストするURLアドレス
url = 'http://httpbin.org/ip'
# 認証付きプロキシサーバーの設定
proxies = { 'http': 'http://user:password@10.10.1.10:3128',
'https': 'http://user:password@10.10.1.10:1080', }
# プロキシ経由でGETリクエストを送信
response = requests.get(url, proxies=proxies)
print(response.json())
実際にはこれを使っているのを見たことないけど、もし自分のテスト用プロキシサーバーを立てるならそれもアリかな。
ただし、URLにログインとパスワードを含めるのは安全でないかもしれない、なぜならそれがブラウザの履歴やサーバーのログに保存されることがあるからね。実際のアプリケーションでは、より安全な認証方法を使ったほうがいいよ。
実際のアプリケーションでは、プロキシサーバーの資格情報を安全に保存することが重要だよ。 コードや設定ファイルにパスワードを平文で保存しないように。代わりに環境変数や安全なシークレットストアを使ってね。
6.3 プロキシとhttp.client
http.clientモジュールでプロキシサーバーを使うには、 手動で接続とリクエストヘッダーを設定する必要があるんだ。
単に接続を作成する際にhostと ポートを指定するだけだよ。
例だよ:
# プロキシサーバーの設定
proxy_host = '10.10.1.10'
proxy_port = 3128
# プロキシサーバーへの接続を作成
conn = http.client.HTTPConnection(proxy_host, proxy_port)
次にプロキシサーバーとのトンネルを設定し、その後に リクエストを送信する必要があるんだ:
dest_url = 'httpbin.org'
dest_path = '/ip'
# リクエストの生成と送信
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
プロキシサーバーが正しく動作しているかどうかを確認するためには、プロキシを使う前と後の自分のIPアドレスを比較することができる。例えば、httpbin.org/ipのような自分の現在のIPアドレスを示すサービスを使うといいね。
非常に「簡単」だよね。HTTPプロキシをhttp.clientで使用する完全な例はこんな感じだよ:
import http.client
# プロキシサーバーの設定
proxy_host = '10.10.1.10'
proxy_port = 3128
dest_url = 'httpbin.org'
dest_path = '/ip'
# プロキシサーバーへの接続を作成
conn = http.client.HTTPConnection(proxy_host, proxy_port)
# リクエストの生成と送信
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
# 応答の取得
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode('utf-8'))
# 接続の閉じる
conn.close()
何と言うべきかな?requestsモジュールを使う方がもちろん簡単だよ。 でも、多くのモジュールやフレームワークはまさに 低レベルのhttp.clientを裏で使っているんだ。どうやってそれを扱うかを知っておく必要があるし、 それらの動作を正しく設定できるようにしよう。
すべてのメリットがある一方で、プロキシサーバーを使うことにデメリットもあるかもね。 例えば、リクエストが追加のステップを経由するから接続速度が遅くなるかもしれないし、 一部のサイトは有名なプロキシサーバーからのアクセスをブロックすることもある。だからプロキシを使う際には、 そのメリットと潜在的な制限の両方を考慮する必要があるんだ。
GO TO FULL VERSION