python 每次创建不同的会话,如何重用它?

a8jjtwal  于 2022-11-28  发布在  Python
关注(0)|答案(1)|浏览(151)

我正在尝试初始化一个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。我是在正确的轨道上还是完全错了?

nx7onnlm

nx7onnlm1#

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创建了一个 Package 器来 Package 实际的requests.Session示例,因此您不需要直接处理它的s属性,假设您在LoginLogout上为您要发出的每种请求都有方法。您只需初始化它一次,然后使用它的方法通过其内部会话对象执行请求。

PS版

你在后续评论中偶然提到,你把它设置成一个脚本,从外部重复调用,根据传递给脚本的参数,你要么登录到网站,要么抓取一个特定的页面。
这表明你甚至不了解“登录”是如何工作的,或者你不了解进程是如何工作的。通常在客户端上创建一些会话属性(例如cookie),这样它就可以向服务器显示它已经通过了身份验证。当使用requests作为HTTP客户端库时,这些数据存储在requests.Session对象中。
调用Python脚本时,您创建了一个新进程。仅仅因为您连续两次启动同一个脚本并不意味着其中一个进程与另一个进程有任何连接。调用脚本登录一次绝对不会影响下次调用该脚本执行其他操作时发生的情况。第二个进程中不会出现任何先前的会话属性。我希望这一点现在已经清楚了。

相关问题