minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Anteriormente, apresentamos como usar reqesuts para iniciar uma solicitação. Hoje apresentaremos como usar session para iniciar uma solicitação. Uma compreensão simples de sessão é um mecanismo de sessão. Depois de fazer login no navegador, não precisamos fazer login novamente ao solicitar dados de serviço posteriormente. Acreditamos que o estado da sua sessão foi salvo no cookie e cada solicitação será automaticamente. transportar os parâmetros do cookie Se você usar reqeusts.request, deverá transportar manualmente os parâmetros do cookie todas as vezes. O objeto de sessão reqeuest.Session() permite persistir certos parâmetros entre solicitações. Ele também manterá o cookie entre todas as solicitações feitas pela mesma instância de Sessão, portanto, não há necessidade de manipular manualmente o status do cookie a cada vez.
Documentação de referência:
Documentação oficial
O método de uso da sessão é realmente semelhante ao método reqeust e também suporta session.get(), session.post(), session.request() e outros 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"}}'
As permissões de verificação de login necessárias ao processar alguns sites podem ser solicitadas através da sessão. O cookie obtido após o login pode ser salvo, para que sempre que precisar fazer login posteriormente, você possa usar diretamente o cookie salvo e usar este cookie. uma sessão e, em seguida, inicie uma solicitação para evitar logins repetidos. Adequado para rastreamento simultâneo de dados de várias máquinas.
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)