requests.Session()每次创建不同的会话.如何重用它?



我正试图初始化requests.Session,以保持与网页的连接。但是,我读到每次调用会话类时,都会创建一个新会话。

怎么可能保持连接存活?因为在我目前的代码中,在我调用login方法后,它给了我网页内容(没关系,它显示我登录到页面并给了我想要的内容),但是当我调用update方法时,它又给了我登录页面的内容,而不是我登录后实际想要的页面。

import requests
class LoginLogout:
# creating session
def __init__(self):
self.s = requests.Session()
# login method
def login(self, user, password, server):
payload_data = {'user': user, 'pass': password, 'server': server}
print(self.s.post(LOGIN_LINK, payload_data))
# update method
def update(self, updt_link):
print(self.s.get(updt_link))
def logout(self):
response = self.s.get('...some webpage/user/logout...')
self.s.close()
print(response)

这里我调用对象:

if switch_parameter == "login":
login_var = LoginLogout()
login_var.login(USER, PASSWORD, SERVER)
print('IS IT OK ?', login_var.s.get('.../login...'))  # <-OK it shows 200 result (but should I use there "s" too ?)
elif switch_parameter == "start":
start()
elif switch_parameter == "stop":
stop()
elif switch_parameter == "update":
update_prem = LoginLogout()
update_prem.update('...different/page...')
# (am I missing here "s" ?, or I shouldnt be using it here anyway)
elif switch_parameter == "logout":
logout()
else:
pass

我在这里做错了什么?我只是想使用login登录网站并保持会话活跃,而每次我需要获得另一个页面时调用update。我到底走对了还是完全错了?

requests.Session的重点是在请求之间持久化短暂的常量(如cookie)。在你的代码中,你初始化一个新的会话对象,当你初始化一个LoginLogout对象。

你在这里做:

if switch_parameter == "login":        
login_var = LoginLogout()
...

你在这里做:

elif switch_parameter == "update":
update_prem = LoginLogout()
...

现在login_varupdate_prem显然是不同的对象,它们都有s属性,每个都持有不同的requests.Session对象。如何期望一个会话的属性神奇地对另一个会话可用?

如果您想使用现有会话,请使用它。

我当然不知道你的实际用例是什么,但从你在这里展示的情况来看,你似乎需要做这样的事情:

scraper_obj = LoginLogout()
scraper_obj.login(USER, PASSWORD, SERVER)
...
scraper_obj.update('...')
...
scraper_obj.logout()

由于您使用LoginLogout在实际的requests.Session实例周围创建了包装器,因此您应该不需要直接处理其s属性,假设您在LoginLogout上为您想要发出的每种请求都有方法。初始化它一次,然后使用它的方法通过它的内部会话对象执行请求。


p

您在后续评论中偶然提到,您将此设置为从外部重复调用的脚本,并根据传递给脚本的参数,您想要登录到站点或抓取特定页面。

这表明你要么不明白如何"登录";或者你不了解过程是如何工作的。通常在客户端上创建一些会话属性(例如cookie),以便它可以将其呈现给服务器,以表明它已经经过身份验证。当使用requests作为HTTP客户端库时,这些数据存储在requests.Session对象中。

调用Python脚本时,创建了一个新进程。仅仅因为您在一行中两次启动同一个脚本并不意味着其中一个进程具有任何连接到另一个。调用脚本登录一次对绝对没有影响下次调用该脚本执行其他操作时会发生什么。这些早期的会话属性都不会出现在第二个进程中。我希望你现在明白了。

最新更新