在scrapy蜘蛛中访问会话cookie

mik*_*une 17 cookies session session-cookies scrapy

我正在尝试访问蜘蛛内的会话cookie.我首先使用蜘蛛登录社交网络:

    def parse(self, response):

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

after_login,我想访问会话cookie,以便将它们传递到另一个模块(这里是selenium),以进一步处理具有身份验证会话的页面.

我想要这样的东西:

     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)
Run Code Online (Sandbox Code Playgroud)

遗憾的是,response.cookies 不会返回会话cookie.

我怎样才能获得会话cookie?我正在查看cookie中间件:scrapy.contrib.downloadermiddleware.cookiesscrapy.http.cookies但似乎没有任何直接的方式来访问会话cookie.

关于我原来的问题,这里还有一些细节:

不幸的是,我使用了你的想法,但我没有看到cookie,虽然我知道它们确实存在,因为scrapy.contrib.downloadermiddleware.cookies中间件确实打印出了cookie!这些正是我想要抓取的cookie.

所以这就是我在做的事情:

after_login(self,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] 
Run Code Online (Sandbox Code Playgroud)

如下面的输出所示,确实存在cookie,但我无法使用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..........
Run Code Online (Sandbox Code Playgroud)

所以我想得到一个字典,其中包含xxx,yyy等键以及相应的值.

谢谢 :)

小智 12

一个典型的例子是拥有一个登录服务器,它在成功登录后提供一个新的会话ID.此新会话ID应与另一个请求一起使用.

这是从源代码中获取的代码,似乎对我有用.

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

码:

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 
Run Code Online (Sandbox Code Playgroud)


war*_*iuc 7

也许这是一种矫枉过正,但我​​不知道你将如何使用这些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
Run Code Online (Sandbox Code Playgroud)

CookieJar 有一些有用的方法.

如果你仍然没有看到饼干 - 也许他们不在那里?


更新:

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)
Run Code Online (Sandbox Code Playgroud)

所以,试试吧 request.headers.getlist('Cookie')

  • 非常感谢您的回答!不幸的是它仍然没有起作用。不过,我确信有cookie。请参阅下面的帖子了解我所做的事情。 (2认同)