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

时间:2013-12-20 10:19:37

标签: python python-3.x urllib2 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()  

我测试了代码,效果很好(根据info) 现在我想将它移植到Python 3以及使用requests lib而不是urllib2 我的想法:

  1. 由于原始代码使用opener,但不确定,我认为requests中的等效代码是requests.Session
  2. 我是否应该在提出请求时传递jar = cookiejar.CookieJar()?也不确定。
  3. 我尝试过像

    这样的东西
    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`中的答案,我尝试再次提出相同的请求,但这些都没有效果。

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

1 个答案:

答案 0 :(得分:5)

  1. 开场白与Session并不完全相似,但对于您的特定用例,它们完全匹配。
  2. 使用Session时,您无需传递CookieJar:请求会自动创建一个,将其附加到Session,然后将Cookie保留到Session为您
  3. 您不需要对数据进行urlencode:请求会为您执行此操作。
  4. allow_redirects默认为True,您无需传递该参数。
  5. 将所有这些放在一起,您的代码应如下所示:

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

    使用您刚刚创建的Session发出的任何请求,如果合适,都会自动将Cookie应用于这些请求。