我需要在自己的项目中完成一个登录任务.幸运的是我发现有人已经完成了.
这是相关的代码.
import re,urllib,urllib2,cookielib class Login(): cj = cookielib.LWPCookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) def __init__(self,name='',password='',domain=''): self.name=name self.password=password self.domain=domain urllib2.install_opener(self.opener) def login(self): params = {'domain':self.domain,'email':self.name,'password':self.password} req = urllib2.Request( website_url, urllib.urlencode(params) ) self.openrate = self.opener.open(req) print self.openrate.geturl() info = self.openrate.read()
我已经测试了代码,它运行得很好(根据info
).
现在我想将它移植到Python 3以及使用requests
lib而不是urllib2.
我的想法:
既然原始代码使用opener
,虽然不确定,我认为它的等价物requests
是requests.Session
我是否应该jar = cookiejar.CookieJar()
在提出要求时通过?不确定.
我尝试过类似的东西
import requests from http import cookiejar from urllib.parse import urlencode jar = cookiejar.CookieJar() s = requests.Session() s.post( website_url, data = urlencode(params), allow_redirects = True, cookies = jar )
另外,按照将`Cookie`放在`CookieJar`中的答案,我尝试再次提出相同的请求,但这些都没有奏效.
这就是我在这里寻求帮助的原因.
有人会告诉我正确的工作方式吗?谢谢〜
一个开场白和一个Session
并不完全类似,但对于你的特定用例,它们完美匹配.
使用a时,您不需要传递CookieJar Session
:请求将自动创建一个,将其附加到Session
,然后将cookie保留Session
给您.
您不需要对数据进行urlencode:请求将为您执行此操作.
allow_redirects
是True
在默认情况下,你并不需要传递的参数.
将所有这些放在一起,您的代码应如下所示:
import requests s = requests.Session() s.post(website_url, data = params)
使用Session
您刚刚创建的任何未来请求,如果适当,将自动将cookie应用于它们.