le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
In precedenza abbiamo introdotto come utilizzare reqesut per avviare una richiesta. Oggi introdurremo come utilizzare la sessione per avviare una richiesta. Una semplice comprensione della sessione è un meccanismo di sessione. Dopo aver effettuato l'accesso al browser, non è necessario accedere nuovamente per richiedere i dati del servizio in un secondo momento. Riteniamo che lo stato della sessione sia stato salvato nel cookie e ogni richiesta verrà eseguita automaticamente trasportare i parametri dei cookie. Se utilizzi reqeusts.request, devi trasportare manualmente i parametri dei cookie ogni volta. L'oggetto di sessione reqeuest.Session() consente di rendere persistenti determinati parametri tra le richieste. Manterrà inoltre il cookie tra tutte le richieste effettuate dalla stessa istanza di Session, quindi non è necessario gestire manualmente lo stato del cookie ogni volta.
Documentazione di riferimento:
Documentazione ufficiale
Il metodo di utilizzo di session è in realtà simile al metodo reqeust e supporta anche session.get(), session.post(), session.request() e altri metodi.
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"}}'
I permessi di verifica dell'accesso richiesti durante l'elaborazione di alcuni siti Web possono essere richiesti tramite la sessione. Il cookie ottenuto dopo l'accesso può essere salvato, in modo che ogni volta che dovrai accedere in seguito, potrai utilizzare direttamente il cookie salvato e utilizzare questo cookie una sessione e quindi avviare una richiesta per evitare accessi ripetuti. Adatto per la scansione simultanea di dati da più macchine.
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)