ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Session を使うのが基本
Cookie は「1 回のリクエストの設定」ではなく「やり取りをまたいで持ち回る状態」です。requests.Session を使うと、サーバーから返ってきた Cookie を自動で保存し、次のリクエストに付けてくれます。
import requests
session = requests.Session()
# 1. ログイン。返ってきたセッション Cookie が session に保存される
session.post("https://example.com/login",
data={"username": "taro", "password": "secret"},
timeout=10)
# 2. 以降のリクエストには自動で付く
res = session.get("https://example.com/mypage", timeout=10)
print(res.status_code)
print(session.cookies.get_dict()) # {'sessionid': 'abc123'}
session.close()
requests.get() を単発で呼ぶ方法では Cookie が保持されないため、ログインが必要なページは必ず 401 / ログイン画面に戻されます。
Cookie を明示的に設定する
import requests
# その 1 回だけ付ける
res = requests.get("https://example.com/",
cookies={"lang": "ja", "theme": "dark"},
timeout=10)
# Session に常設する(以降すべてのリクエストに付く)
session = requests.Session()
session.cookies.set("lang", "ja")
session.cookies.set("sessionid", "abc123",
domain="example.com", path="/")
# ヘッダーとして直接書くこともできるが、Session の管理から外れるので非推奨
res = requests.get(url, headers={"Cookie": "lang=ja; theme=dark"}, timeout=10)
domain を指定しないと、そのリクエストのホストにだけ送られます。複数のサブドメインをまたぐ場合は明示してください。
受け取った Cookie を読む
res = requests.get("https://example.com/", timeout=10)
print(res.cookies.get_dict()) # そのレスポンスで設定されたものだけ
print(res.cookies.get("sessionid")) # 無ければ None
print(res.headers.get("Set-Cookie")) # 生のヘッダー文字列
# 属性まで見たいときは 1 個ずつ走査する
for c in res.cookies:
print(c.name, c.value, c.domain, c.path, c.secure, c.expires)
| 書き方 | 返るもの |
|---|---|
res.cookies | そのレスポンスで新しく設定された Cookie |
session.cookies | これまでに蓄積されたすべての Cookie |
res.request.headers["Cookie"] | 実際に送信した Cookie ヘッダー |
「送ったつもりが送られていない」場合は 3 番目を確認します。ドメインやパスが合っていないと、保持されていても送信対象から外れます。
削除と更新
session.cookies.set("lang", "en") # 同じ名前なら上書き
del session.cookies["lang"] # 1 個削除
session.cookies.clear() # 全削除(ログアウト相当)
session.cookies.clear("example.com") # ドメイン単位で削除
print("lang" in session.cookies.get_dict()) # False
ログイン状態をファイルに保存する
import http.cookiejar
import os
import requests
JAR_PATH = "cookies.txt"
jar = http.cookiejar.LWPCookieJar(JAR_PATH)
if os.path.exists(JAR_PATH):
jar.load(ignore_discard=True) # 前回の Cookie を復元
session = requests.Session()
session.cookies = jar # Session に差し込む
session.get("https://example.com/mypage", timeout=10)
jar.save(ignore_discard=True) # セッション Cookie も含めて保存
ignore_discard=True を付けないと、ブラウザを閉じたら消える種類の Cookie が保存されません。保存したファイルはログイン情報そのものなので、権限を絞り、リポジトリに入れないでください。
サーバー側で Cookie を返す
Web アプリを自作する場合は Set-Cookie ヘッダーを組み立てます。標準ライブラリの http.cookies が属性のエスケープまで面倒を見てくれます。
from http.cookies import SimpleCookie
cookie = SimpleCookie()
cookie["sessionid"] = "abc123"
cookie["sessionid"]["path"] = "/"
cookie["sessionid"]["max-age"] = 3600
cookie["sessionid"]["httponly"] = True # JavaScript から読めなくする
cookie["sessionid"]["secure"] = True # HTTPS のときだけ送らせる
cookie["sessionid"]["samesite"] = "Lax" # 別サイトからの送信を制限
print(cookie.output(header="Set-Cookie:"))
# Set-Cookie: sessionid=abc123; HttpOnly; Max-Age=3600; Path=/; SameSite=Lax; Secure
# 受け取ったヘッダーを解析する
incoming = SimpleCookie("lang=ja; theme=dark")
print(incoming["lang"].value) # ja
| 属性 | 意味 | 推奨 |
|---|---|---|
HttpOnly | JavaScript から読めなくする | セッション ID には必ず付ける |
Secure | HTTPS のときだけ送る | 本番では付ける |
SameSite | 他サイト由来のリクエストで送るか | Lax が既定的。決済系は Strict |
Max-Age / Expires | 有効期限 | 省略するとブラウザを閉じるまで |
Path / Domain | 送信対象の範囲 | 広げすぎない |
よくある詰まりどころ
- Session を使っていない — 単発の
requests.get()では Cookie が引き継がれない - リダイレクト先で消える —
allow_redirects=Falseにして途中のSet-Cookieを確認する - ログインが JavaScript 経由 — フォーム POST ではなく API を叩いている。ブラウザの開発者ツールで実際のリクエストを見る
- CSRF トークンが必要 — ログインページを一度 GET してトークンを取り出し、POST に含める
- 日本語や記号が入る値 —
urllib.parse.quote()でエンコードしてから入れる
関連
- 文法 — 親カテゴリ
- httpリクエスト(curl)をする方法
- Responseオブジェクトの中身の確認
- Webスクレイピング
- cookieの値の設定と取得 — Django での扱い
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?