Partage de technologie

Tutoriel sur le robot d'exploration Python Partie 6 - Utilisation d'une session pour lancer une requête

2024-07-12

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

Pourquoi utiliser la session

Auparavant, nous avons présenté comment utiliser les reqesuts pour lancer une requête. Aujourd'hui, nous allons présenter comment utiliser la session pour lancer une requête. Une simple compréhension de la session est un mécanisme de session. Une fois connectés au navigateur, nous n'avons pas besoin de nous reconnecter lors de la demande ultérieure de données de service. Nous pensons que l'état de votre session a été enregistré dans le cookie et que chaque demande sera automatiquement enregistrée. transporter les paramètres du cookie. Si vous utilisez reqeusts.request, vous devez transporter manuellement les paramètres du cookie à chaque fois. L'objet de session reqeuest.Session() vous permet de conserver certains paramètres entre les requêtes. Il conservera également le cookie entre toutes les requêtes effectuées par la même instance de Session, il n'est donc pas nécessaire de gérer manuellement l'état du cookie à chaque fois.

Documentation de référence :
Documentation officielle

comment utiliser

La méthode d'utilisation de session est en fait similaire à la méthode reqeust et prend également en charge session.get(), session.post(), session.request() et d'autres méthodes.

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

Meilleures pratiques de réutilisation des cookies

Les autorisations de vérification de connexion requises lors du traitement de certains sites Web peuvent être demandées via la session. Le cookie obtenu après la connexion peut être enregistré, de sorte que chaque fois que vous aurez besoin de vous connecter ultérieurement, vous pourrez utiliser directement le cookie enregistré et utiliser ce cookie Construct. une session, puis lancez une demande pour éviter les connexions répétées. Convient à l'analyse simultanée des données de plusieurs machines.

Pratique de réutilisation des 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