web-dev-qa-db-ja.com

リクエスト(Python)Cookieをファイルに保存する方法は?

リクエスト後にライブラリrequests(Pythonで)を使用する方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
bot = requests.session()
bot.get('http://google.com')

すべてのCookieをファイルに保存してから、ファイルからCookieを復元します。

38
agrynchuk

すぐにそれを行う方法はありませんが、それは難しくありません。

セッションからCookieJarオブジェクトを_session.cookies_として取得できます。 pickle を使用してファイルに保存できます。

完全な例:

_import requests, pickle
session = requests.session()
# Make some calls
with open('somefile', 'wb') as f:
    pickle.dump(session.cookies, f)
_

読み込みは次のとおりです。

_session = requests.session()  # or an existing session

with open('somefile', 'rb') as f:
    session.cookies.update(pickle.load(f))
_

要求ライブラリは requests.cookies.RequestsCookieJar()サブクラス を使用しており、これは明示的にpicklingおよびdictのようなAPIをサポートし、 RequestsCookieJar.update()メソッドを使用できます 既存のセッションcookie jarをpickleファイルからロードされたもので更新します。

57
madjar

r = requests.get()などの呼び出しの後、r.cookiesRequestsCookieJarを返します。これは直接 pickle 、つまり.

import pickle
def save_cookies(requests_cookiejar, filename):
    with open(filename, 'wb') as f:
        pickle.dump(requests_cookiejar, f)

def load_cookies(filename):
    with open(filename, 'rb') as f:
        return pickle.load(f)

#save cookies
r = requests.get(url)
save_cookies(r.cookies, filename)

#load cookies and do a request
requests.get(url, cookies=load_cookies(filename))

Cookieを人間が読み取れる形式で保存する場合は、RequestsCookieJarLWPCookieJar に抽出するための作業を行う必要があります。

import cookielib
def save_cookies_lwp(cookiejar, filename):
    lwp_cookiejar = cookielib.LWPCookieJar()
    for c in cookiejar:
        args = dict(vars(c).items())
        args['rest'] = args['_rest']
        del args['_rest']
        c = cookielib.Cookie(**args)
        lwp_cookiejar.set_cookie(c)
    lwp_cookiejar.save(filename, ignore_discard=True)

def load_cookies_from_lwp(filename):
    lwp_cookiejar = cookielib.LWPCookieJar()
    lwp_cookiejar.load(filename, ignore_discard=True)
    return lwp_cookiejar

#save human-readable
r = requests.get(url)
save_cookies_lwp(r.cookies, filename)

#you can pass a LWPCookieJar directly to requests
requests.get(url, cookies=load_cookies_from_lwp(filename))
28
dtheodor

@ miracle2kの答えを拡張すると、リクエストSessionsは cookielibCookieJarで動作します ドキュメント化 です。 LWPCookieJar(およびMozillaCookieJar)は、ファイルとの間でCookieを保存およびロードできます。以下は、リクエストセッションのCookieを保存およびロードする完全なコードスニペットです。 ignore_discardパラメーターは、テストのためにhttpbinを操作するために使用されますが、実際のコードに含めたくない場合があります。

import os
from cookielib import LWPCookieJar

import requests


s = requests.Session()
s.cookies = LWPCookieJar('cookiejar')
if not os.path.exists('cookiejar'):
    # Create a new cookies file and set our Session's cookies
    print('setting cookies')
    s.cookies.save()
    r = s.get('http://httpbin.org/cookies/set?k1=v1&k2=v2')
else:
    # Load saved cookies from the file and use them in a request
    print('loading saved cookies')
    s.cookies.load(ignore_discard=True)
    r = s.get('http://httpbin.org/cookies')
print(r.text)
# Save the session's cookies back to the file
s.cookies.save(ignore_discard=True)
22
gazpachoking

私はjsonによる方法を提供します:

# to save cookie
import json
with open('cookie.txt', 'w') as f:
    json.dump(requests.utils.dict_from_cookiejar(bot.cookies), f)

そして

# to load cookie
import json
with open('cookie.txt', 'r') as f:
    cookie = requests.utils.cookiejar_from_dict(json.load(f))
9
Lewis Livermore

これは仕事をします:

session.cookies = LWPCookieJar('cookies.txt')

ただし、CookieJar APIでは、load()およびsave()を手動で呼び出す必要があります。 cookies.txtの形式を気にしない場合は、変更時に持続する ShelvedCookieJar 実装があります。

8
miracle2k

他の回答には問題があることがわかりました。

  • セッションには適用されませんでした。
  • 正しく保存およびロードされませんでした。 Cookieの名前と値のみが保存され、有効期限、ドメイン名などはすべて失われました。

この回答により、次の2つの問題が解決されます。

_import requests.cookies

def save_cookies(session, filename):
    if not os.path.isdir(os.path.dirname(filename)):
        return False
    with open(filename, 'w') as f:
        f.truncate()
        pickle.dump(session.cookies._cookies, f)


def load_cookies(session, filename):
    if not os.path.isfile(filename):
        return False

    with open(filename) as f:
        cookies = pickle.load(f)
        if cookies:
            jar = requests.cookies.RequestsCookieJar()
            jar._cookies = cookies
            session.cookies = jar
        else:
            return False
_

次に、save_cookies(session, filename)を呼び出して保存するか、load_cookies(session, filename)を呼び出してロードします。そのような単純な。

7
MattClimbs

Cookiesオブジェクトを直接pickleできます:

cookies = pickle.dumps(session.cookies)

Dict表現は、有効期限、ドメイン、パスなどの多くの情報を見逃しています...

Cookieを使用する目的によって異なりますが、たとえば有効期限に関する情報がない場合は、手動で有効期限を追跡するロジックを実装する必要があります。

ライブラリから返されたオブジェクトをピクルすると、状態を簡単に再構築でき、ライブラリの実装を中継できます。

明らかに、このように、漬け物の消費者は同じライブラリを使用する必要があります

2
JackNova

dtheodorの答えは95%になりましたが、これを除きます:

session = requests.session(cookies=cookies)

私にとって、これはsession()が引数を取らないという例外を発生させます。

Cookie.get_dictでキー/値を取得し、それらを使用して手動でセッションに追加することで、これを回避しました:

session.cookies.set(cookies.keys()[n],cookies.values()[n])
2
gtalarico

python 3のコード

インターネット上のCookieの大部分はNetscape Cookieであることに注意してください。したがって、Mozilla cookies.txtファイル形式(LynxおよびNetscapeブラウザーでも使用されます)でCookieをディスクに保存する場合は、MozillaCookieJarを使用します。

from http.cookiejar import MozillaCookieJar
import requests

s = requests.Session()
s.cookies = MozillaCookieJar('cookies.txt')
# or s.cookies = MozillaCookieJar() and later use s.cookies.filename = 'cookies.txt' or pass the file name to save method.

response = s.get('https://www.msn.com')

s.cookies.save()

ファイルが既に存在する場合は上書きされるため、ファイルに含まれるすべてのCookieが消去されます。保存されたCookieは、後でload()またはrevert()メソッドを使用して復元できます。

Save()メソッドは、trueのignore_discard引数を渡して別の方法で要求しない限り、セッションCookieを保存しないことに注意してください。

s.cookies.save(ignore_discard=True)

ロード方法を使用:

ファイルからクッキーをロードします。

新しくロードされたcookieによって上書きされない限り、古いcookieは保持されます。

s.cookies.load()

復帰方法を使用:

すべてのCookieをクリアし、保存されたファイルからCookieをリロードします。

s.cookies.revert()

また、loadメソッドまたはrevertメソッドでtrueのignore_discard引数を渡す必要がある場合があります。

MozillaCookieJarの使用に関する注意:

注これにより、RFC 2965 Cookieに関する情報と、ポートなどの新しいまたは非標準のCookie属性に関する情報が失われます。

もっと読む

1
Sameh Farouk

Cookieを辞書のリストに変換し、jsonまたはdbに保存する簡単な方法。これは、session属性を持つクラスのメソッドです。

def dump_cookies(self):
    cookies = []
    for c in self.session.cookies:
        cookies.append({
            "name": c.name,
            "value": c.value,
            "domain": c.domain,
            "path": c.path,
            "expires": c.expires
        })
    return cookies

def load_cookies(self, cookies):
    for c in cookies:
        self.session.cookies.set(**c)

必要なのは、namevaluedomainpathexpiresなどの5つのパラメーターのみです。

0
Mikhail Bulygin