我正在尝试访问蜘蛛内的会话cookie。我首先使用蜘蛛登录社交网络:
def parse(self, response):
return [FormRequest.from_response(response,
formname='login_form',
formdata={'email': '...', 'pass':'...'},
callback=self.after_login)]
在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)
不幸的是,response.cookies
不会返回会话Cookie。
如何获取会话Cookie?我正在查看cookie中间件: scrapy.contrib.downloadermiddleware.cookies 和 scrapy.http.cookies 但似乎没有任何直接的方式来访问会话饼干。
我的原始问题还有更多细节:
不幸的是,我使用了你的想法,但我看不到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]
如下面的输出所示,确实存在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..........
所以我想得到一个字典,其中包含关键字xxx,yyy等以及相应的值。
谢谢:)
答案 0 :(得分: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
答案 1 :(得分: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
有一些有用的方法。
如果你还没看到饼干 - 也许它们不在那里?
<强>更新强>:
查看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')
答案 2 :(得分:0)
这对我有用
response.request.headers.get('Cookie')
似乎返回了中间件在请求中,会话中或其他情况下引入的所有cookie。