2012-01-03 60 views
17

我想訪問蜘蛛內的會話cookie。我第一次登錄到社交網絡使用的蜘蛛:訪問scrapy蜘蛛中的會話cookie

def parse(self, response): 

     return [FormRequest.from_response(response, 
       formname='login_form', 
       formdata={'email': '...', 'pass':'...'}, 
       callback=self.after_login)] 

after_login,我想訪問會話cookie,以便將其傳遞給其他模塊(這裏硒),以進一步處理與頁面認證會話。

,我想這樣的事情:

 def after_login(self, response): 

     # process response 
     ..... 

     # access the cookies of that session to access another URL in the 
     # same domain with the autehnticated session. 
     # Something like: 
     session_cookies = XXX.get_session_cookies() 
     data = another_function(url,cookies) 

不幸的是,response.cookies不返回的會話cookie。

如何獲取會話cookie?我正在查看cookie中間件:scrapy.contrib.downloadermiddleware.cookiesscrapy.http.cookies但似乎沒有任何直接的方式來訪問會話cookie。

更多的細節在這裏回合我原來的問題:

不幸的是,我用了你的想法,但我dind't看到餅乾,雖然我知道肯定是他們自scrapy.contrib.downloadermiddleware存在.cookies中間件確實打印出cookies!這些正是我想要抓取的餅乾。

因此,這裏是我在做什麼:

的after_login(個體經營,response)方法接收正確的身份驗證後的反應變量,然後我訪問的URL與會話數據:

def after_login(self, response): 

     # testing to see if I can get the session cookies 
     cookieJar = response.meta.setdefault('cookie_jar', CookieJar()) 
     cookieJar.extract_cookies(response, response.request) 
     cookies_test = cookieJar._cookies 
     print "cookies - test:",cookies_test 

     # URL access with authenticated session 
     url = "http://site.org/?id=XXXX"  
     request = Request(url=url,callback=self.get_pict) 
     return [request] 

如下所示的輸出,的確是有餅乾,但我失敗cookieJar捕捉它們:

cookies - test: {} 
2012-01-02 22:44:39-0800 [myspider] DEBUG: Sending cookies to: <GET http://www.facebook.com/profile.php?id=529907453> 
    Cookie: xxx=3..........; yyy=34.............; zzz=.................; uuu=44.......... 

所以我想獲得包含密鑰XXX字典,YY y等與相應的值。

謝謝:)

+0

我是否理解正確的話,你想在Facebook上進行身份驗證,但是從不同的領域抽取數據進行認證的Facebook? – warvariuc 2012-01-03 07:25:10

回答

6

也許這就是矯枉過正,但我​​不知道你怎麼使用這些Cookie,所以它可能是有用的(從實際代碼摘錄 - 它適應你的情況) :

from scrapy.http.cookies import CookieJar 

class MySpider(BaseSpider): 

    def parse(self, response): 

     cookieJar = response.meta.setdefault('cookie_jar', CookieJar()) 
     cookieJar.extract_cookies(response, response.request) 
     request = Request(nextPageLink, callback = self.parse2, 
         meta = {'dont_merge_cookies': True, 'cookie_jar': cookieJar}) 
     cookieJar.add_cookie_header(request) # apply Set-Cookie ourselves 

CookieJar有一些有用的方法。

如果你還沒有看到餅乾 - 也許他們不在那裏?


UPDATE

看着CookiesMiddleware代碼:

class CookiesMiddleware(object): 
    def _debug_cookie(self, request, spider): 
     if self.debug: 
      cl = request.headers.getlist('Cookie') 
      if cl: 
       msg = "Sending cookies to: %s" % request + os.linesep 
       msg += os.linesep.join("Cookie: %s" % c for c in cl) 
       log.msg(msg, spider=spider, level=log.DEBUG) 

所以,儘量request.headers.getlist('Cookie')

+1

非常感謝您的回答!不幸的是,它仍然沒有工作。無論如何,我知道肯定有餅乾。請參閱下面的帖子,瞭解我所做的。 – mikolune 2012-01-03 06:51:13

+0

請參閱我的編輯原帖以查看我的回覆!非常感謝:) – mikolune 2012-01-03 07:07:43

+0

@mikolune,看到更新。此外,學習查看源代碼 - 這就是爲什麼Python很好 - 您可以查看源代碼,這有時是最好的文檔。 – warvariuc 2012-01-03 07:32:13

12

一個典型的例子是有一個登錄服務器,它提供了一個新的會話ID成功登錄後。這個新的會話ID應該與另一個請求一起使用。

這裏是從源代碼中拾取的代碼似乎爲我工作。

print 'cookie from login', response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 

代碼:

def check_logged(self, response): 
tmpCookie = response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 
print 'cookie from login', response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 
cookieHolder=dict(SESSION_ID=tmpCookie) 

#print response.body 
if "my name" in response.body: 
    yield Request(url="<<new url for another server>>", 
     cookies=cookieHolder, 
     callback=self."<<another function here>>") 
else: 
    print "login failed" 
     return