Python请求lib,是request.ession相当于urllib2的开启者吗?

lai*_*e9m 2 python urllib2 python-3.x python-requests

我需要在自己的项目中完成一个登录任务.幸运的是我发现有人已经完成了.
这是相关的代码.

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()  
Run Code Online (Sandbox Code Playgroud)

我已经测试了代码,它运行得很好(根据info).
现在我想将它移植到Python 3以及使用requestslib而不是urllib2.
我的想法:

  1. 既然原始代码使用opener,虽然不确定,我认为它的等价物requestsrequests.Session
  2. 我是否应该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  
) 
Run Code Online (Sandbox Code Playgroud)

另外,按照将`Cookie`放在`CookieJar`中的答案,我尝试再次提出相同的请求,但这些都没有奏效.

这就是我在这里寻求帮助的原因.
有人会告诉我正确的工作方式吗?谢谢〜

Luk*_*asa 5

  1. 一个开场白和一个Session并不完全类似,但对于你的特定用例,它们完美匹配.
  2. 使用a时,您不需要传递CookieJar Session:请求将自动创建一个,将其附加到Session,然后将cookie保留Session给您.
  3. 您不需要对数据进行urlencode:请求将为您执行此操作.
  4. allow_redirectsTrue在默认情况下,你并不需要传递的参数.

将所有这些放在一起,您的代码应如下所示:

import requests

s = requests.Session()
s.post(website_url, data = params)
Run Code Online (Sandbox Code Playgroud)

使用Session您刚刚创建的任何未来请求,如果适当,将自动将cookie应用于它们.