Подтвердить что ты не робот

Как сохранить файлы cookie (python) в файл?

Как использовать библиотеку requests (в python) после запроса

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

чтобы сохранить все файлы cookie в файле, а затем восстановить файлы cookie из файла.

4b9b3361

Ответ 1

Нет прямого способа сделать это, но это не сложно сделать.

Вы можете получить объект CookieJar из сеанса как session.cookies. Вы можете использовать requests.utils.dict_from_cookiejar, чтобы преобразовать его в dict. Затем вы можете использовать pickle, чтобы сохранить его в файле (вы также можете использовать shelve, если вам нужно сохранить несколько вещей).

Полный пример:

import requests, requests.utils, pickle
session = requests.session()
# Make some calls
with open('somefile', 'w') as f:
    pickle.dump(requests.utils.dict_from_cookiejar(session.cookies), f)

Загрузка:

with open('somefile') as f:
    cookies = requests.utils.cookiejar_from_dict(pickle.load(f))
    session = requests.session(cookies=cookies)

Ответ 2

После вызова, такого как r = requests.get(), r.cookies вернет RequestsCookieJar, который вы можете напрямую 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 в удобном для чтения формате, вам нужно выполнить некоторую работу, чтобы извлечь RequestsCookieJar в LWPCookieJar.

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))

Ответ 3

Расширение на @miracle2k ответа, запросы Session документированы для работы с любым cookielib CookieJar. LWPCookieJarMozillaCookieJar) могут сохранять и загружать файлы 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 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 cookies back to the file
s.cookies.save(ignore_discard=True)

Ответ 4

Это выполнит задание:

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

API CookieJar требует, чтобы вы вызывали load() и save() вручную. Если вам не нужен формат cookies.txt, у меня есть реализация ShelvedCookieJar, которая будет сохраняться при изменении.

Ответ 5

Я обнаружил, что другие ответы были проблемы:

  • Они не применялись к сеансам.
  • Они не сохраняли и не загружали должным образом. Было сохранено только имя и значение cookie, дата истечения срока действия, имя домена и т.д. Были потеряны.

Этот ответ устраняет эти два вопроса:

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) для загрузки. Просто как это.

Ответ 6

Ответ dtheodor получил 95%, кроме этого:

session = requests.session(cookies=cookies)

Для меня это вызывает исключение: session() не принимает аргументы.

Я работал над этим, беря ключи/значения в файле cookie.get_dict и добавляя их вручную в сеанс, используя:

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

Ответ 7

Я предлагаю путь 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))

Ответ 8

Вы можете самостоятельно раскрыть файл cookie:

cookies = pickle.dumps(session.cookies)

В представлении dict отсутствует много информации: expiration, domain, path...

Это зависит от использования, которое вы намереваетесь делать с кукисами, но если у вас нет информации об истечении срока действия, например, вы должны реализовать логику отслеживания срока действия вручную.

Выбрав возвращаемый объект библиотеки, вы можете легко восстановить состояние, затем вы можете ретранслировать реализацию библиотеки.

Очевидно, что таким образом, потребитель маринованного объекта должен использовать одну и ту же библиотеку