2012-01-03 112 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