2013-12-20 21 views
2

我需要在自己的项目中完成登录任务。我发现有人已经完成了它。
以下是相关的代码。Python请求lib,是requests.Session相当于urllib2的opener?

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。
我的想法:

  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 
) 

而且,随后的回答中Putting a `Cookie` in a `CookieJar`,我试图再次犯同样的请求,但这些都不奏效。

这就是为什么我在这里寻求帮助。
有人会告诉我做正确的工作方式吗?谢谢〜

回答

5
  1. 开瓶器和Session并不完全类似,但对于您的特殊用途,它们完美匹配。
  2. 使用Session时,您无需通过CookieJar:请求将自动创建一个,将其附加到Session,然后将cookie保存到Session
  3. 你不需要urlencode数据:请求会为你做。
  4. allow_redirects默认为True,您不需要传递该参数。

把所有的一起,你的代码应该是这样的:

import requests 

s = requests.Session() 
s.post(website_url, data = params) 

任何将来的请求使用您刚才创建的Session将自动具有应用到他们是否适合做饼干。

+0

谢谢,我终于找到了它的工作。它有'urlencode'导致了这个问题.BTW,你说“一个开场和一个Session不完全相似”,那么opener的等价物是什么? – laike9m

+0

没有开门人的等价物,因为请求完全拒绝了这个想法。 “会话”是请求维持状态的地方,因此从这个意义上说,它们就像开场者一样,但它们只有一种类型,它们都是状态维护:从这个意义上说,它们不是开场白。 – Lukasa