【问题标题】:Python requests lib, is requests.Session equivalent to urllib2's opener?Python requests lib,requests.Session 相当于 urllib2 的开瓶器吗?
【发布时间】:2013-12-20 10:19:37
【问题描述】:

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

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() 吗?也不确定。

我尝试过类似的东西

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`中的答案,我尝试再次提出相同的请求,但这些都不起作用。

这就是我在这里寻求帮助的原因。
有人会告诉我做这项工作的正确方法吗?谢谢~

【问题讨论】:

    标签: python python-3.x urllib2 python-requests


    【解决方案1】:
    1. opener 和 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 发出的任何请求都将在适当的情况下自动应用 cookie。

    【讨论】:

    • 谢谢你,我终于让它工作了。它有urlencode 导致了问题。顺便说一句,你说“一个开场白和一个会话不完全相似”,那么什么是相当于开瓶器?
    • 没有等价的 opener,因为 Requests 完全拒绝这个想法。 Sessions 是 Requests 维护状态的地方,所以从这个意义上说,它们 像开启者,但只有一种,它完成所有状态维护:从这个意义上说,它们 不像 i> 开瓶器。
    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多