2013-12-20 25 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