Compartir tecnología

Tutorial del rastreador de Python Parte 6: uso de la sesión para iniciar una solicitud

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

¿Por qué usar la sesión?

Anteriormente presentamos cómo usar reqesuts para iniciar una solicitud. Hoy presentaremos cómo usar la sesión para iniciar una solicitud. Una comprensión simple de la sesión es un mecanismo de sesión. Después de iniciar sesión en el navegador, no necesitamos iniciar sesión nuevamente cuando solicitamos datos de servicio más adelante. Creemos que el estado de su sesión se ha guardado en la cookie y cada solicitud se guardará automáticamente. llevar los parámetros de las cookies Si utiliza reqeusts.request, debe llevar los parámetros de las cookies manualmente cada vez. El objeto de sesión reqeuest.Session() le permite conservar ciertos parámetros en todas las solicitudes. También mantendrá la cookie entre todas las solicitudes realizadas por la misma instancia de sesión, por lo que no es necesario manejar manualmente el estado de la cookie cada vez.

Documentación de referencia:
Documentación oficial

cómo utilizar

El método de uso de sesión es en realidad similar al método request y también admite session.get (), session.post (), session.request () y otros métodos.

s = requests.Session()

s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('https://httpbin.org/cookies')

print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Mejores prácticas de reutilización de cookies

Los permisos de verificación de inicio de sesión necesarios al procesar algunos sitios web se pueden solicitar a través de la sesión. La cookie obtenida después de iniciar sesión se puede guardar, de modo que cada vez que necesite iniciar sesión más adelante, pueda usar directamente la cookie guardada y usar esta cookie. una sesión y luego iniciar una solicitud para evitar inicios de sesión repetidos. Adecuado para el rastreo simultáneo de datos desde varias máquinas.

Práctica de reutilización de cookies:

import json
import traceback

import requests.utils

from executor.page_executor import PageExecutor
from file_path import get_absolute_path


cookie_path = get_absolute_path('data/cookie.txt')
request_session: requests.Session = None

def __load_cookie():
    '''
    加载本地cookie,如果存在加载,如果不存在就返回空
    :param session:
    :return:
    '''
    try:
        with open(cookie_path, "r") as f:
            load_cookie = json.load(f)
            return requests.utils.cookiejar_from_dict(load_cookie)
    except Exception as e:
        traceback.print_exc()
        return None

def get_session():
    global request_session
    if request_session is not None:
        return request_session
    else:
        request_session = requests.Session()
        exist_cookies = __load_cookie()
        if exist_cookies is not None:
            request_session.cookies.update(exist_cookies)

        return request_session

def save_cookie():
    # 登录成功, session里的cookie是最全的,response返回的cookie不全
    cookiejar = requests.utils.dict_from_cookiejar(request_session.cookies)
    with open(cookie_path, "w") as f:
        json.dump(cookiejar, f, indent=True)
    whv_logger.info('cookies saved to ./data/cookie.txt')


def update_cookie():
    '''
    为什么需要一个新的session
    # 走到这一步,说明session已经过期,重新获取session,需要重新处理下session
    # 1. 但是因为携带有旧的session,导致携带旧的__RequestVerificationToken和新的__RequestVerificationToken一起请求,登录失败
    # 2. 所以需要重新处理下session,主要是处理__RequestVerificationToken
    :return:
    '''
    error_cookie_jar = requests.utils.dict_from_cookiejar(request_session.cookies)

    new_cookie_jar = {'__RequestVerificationToken': error_cookie_jar['__RequestVerificationToken']}
    new_cookie = requests.utils.cookiejar_from_dict(new_cookie_jar)

    # 清空旧的cookie
    request_session.cookies.clear_session_cookies()
    # 填充新的cookie
    request_session.cookies.update(new_cookie)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63