4

我正在使用此代码登录网站。在 POST 请求之后,网站重定向到个人资料页面,我可以看到我已经登录。但下一个请求不会让我保持登录状态,即使我存储了 cookie。这不是特别关于 pastebin 网站,所以请不要告诉我使用他们的 API

def web_login(username,password):
        LOGIN_URL = 'http://pastebin.com/login.php'
        HOME_URL = 'http://pastebin.com/'
        jar = cookielib.CookieJar()
        payload = {"user_name":username,"user_password":password,"submit_hidden":"submit_hidden"}
        s = requests.Session()
        user_agent = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0'}
        r = s.post(LOGIN_URL,data=payload,headers=user_agent,cookies=jar)
        r = s.get(HOME_URL,headers=user_agent,cookies=jar)        
        print r.text
4

1 回答 1

4

正如@falsetru 指出的那样,您的问题是使用外部 cookie jar。原因是每个 Session 对象都有自己的 cookie jar,并且会自动为您存储它们。传入一个值来cookies告诉 Session 更喜欢那个 jar 而不是它的内部那个,并且不会更新传入的那个。如果你想更明确,你可以这样做:

r = s.post(LOGIN_URL, data=payload, headers=user_agent)
jar = r.cookies
home = s.get(HOME_URL, headers=user_agent, cookies=jar)

要注意的另一件事是,如果您每次都发送相同的标头,则可以执行以下操作:

s = requests.Session()
s.headers.update(user_agent)
r = s.post(LOGIN_URL, data=payload)
home = s.get(HOME_URL)

我希望这可以帮助您理解为什么 @falsetru 告诉您的内容有效,并帮助其他看到这一点的人。

我还应该指出,如果你想使用一个自定义的 cookie jar,它提供与cookielib.CookieJar你一样的界面:

jar = MyCookieJar()
s = requests.Session()
s.cookies = jar
r = s.post(LOGIN_URL, data=payload)
home = s.get(HOME_URL)

jar然后您可以通过和访问您的 cookie s.cookies

于 2013-09-15T14:44:27.210 回答