Berbagi teknologi

Tutorial perayap Python Bagian 6 - Menggunakan sesi untuk memulai permintaan

2024-07-12

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

Mengapa menggunakan sesi

Sebelumnya kami telah memperkenalkan cara menggunakan reqesuts untuk memulai permintaan. Hari ini kami akan memperkenalkan cara menggunakan session untuk memulai permintaan. Pemahaman sederhana tentang sesi adalah mekanisme sesi. Setelah kita login di browser, kita tidak perlu login lagi saat meminta data layanan nanti. Menurut kami, status sesi Anda telah disimpan di cookie, dan setiap permintaan akan otomatis membawa parameter cookie. Jika Anda menggunakan reqeusts.request, Anda harus membawa parameter cookie secara manual setiap saat. Objek sesi reqeuest.Session() memungkinkan Anda mempertahankan parameter tertentu di seluruh permintaan. Ini juga akan mempertahankan cookie di antara semua permintaan yang dibuat oleh instance Sesi yang sama, sehingga tidak perlu menangani status cookie secara manual setiap saat.

Dokumentasi referensi:
Dokumentasi resmi

Cara Penggunaan

Metode penggunaan session sebenarnya mirip dengan metode reqeust, dan juga mendukung session.get(), session.post(), session.request() dan metode lainnya.

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

Praktik Terbaik Penggunaan Kembali Cookie

Izin verifikasi login yang diperlukan saat memproses beberapa situs web dapat diminta melalui sesi. Cookie yang diperoleh setelah login dapat disimpan, sehingga setiap kali Anda perlu login nanti, Anda dapat langsung menggunakan cookie yang disimpan dan menggunakan cookie ini sesi dan kemudian memulai permintaan untuk menghindari login berulang. Cocok untuk perayapan data secara bersamaan dari beberapa mesin.

Praktik penggunaan kembali cookie:

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