2012-01-03 4 views
17

거미 내의 세션 쿠키에 액세스하려고합니다.치료 스파이더의 세션 쿠키에 액세스하십시오.

def parse(self, response): 

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

하는 after_login, 나는이 추가로있는 페이지를 처리하는 다른 모듈 (여기 셀레늄)을 통과하기 위해, 세션 쿠키 접근하고 싶습니다 : 내가 먼저 거미에 사용하는 소셜 네트워크에 로그인 인증 된 세션.

 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는 세션 쿠키를 반환하지 않습니다

나는 그런 일을하고 싶습니다.

세션 쿠키는 어떻게 구할 수 있습니까? 나는 쿠키 미들웨어를보고 있었다 : scrapy.contrib.downloadermiddleware.cookiesscrapy.http.cookies 그러나 세션 쿠키에 접근하는 간단한 방법은없는 것 같다.

내 원래의 질문 한판 승부가 여기에 좀 더 세부 정보 :

불행하게도, 당신의 아이디어를 사용하지만 난 그들이 scrapy.contrib.downloadermiddleware 때문에 존재하는지 확실히 알고 있지만 나는 쿠키를 참조 dind't .cookies 미들웨어가 쿠키를 출력하지 않습니다! 이것들은 제가 꼭 잡고 싶어하는 쿠키입니다.

after_login

은 (자기 응답) 방법은 적절한 인증 후 응답 변수를 수신 한 다음 내가 세션 데이터가있는 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를 포함하는 사전을 좀하고 싶습니다 y 등을 해당 값과 비교합니다.

감사합니다 :)

+0

내가 페이스 북에 인증되는 당신이 페이스 북에 인증 할 것인지 제대로 이해하지만 다른 도메인에서 데이터를 긁어합니까? – warvariuc

답변

6

은 어쩌면 이것은 과잉이다,하지만 난 당신이 그 쿠키를 사용하려고하는 방법을 모르는, 그래서 유용 할 수 있습니다 (- 귀하의 경우에 적응 실제 코드에서 발췌) :

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) 

, 전형적인 예는 새로운 세션 ID를 제공하는 로그인 서버를 가지고있다 request.headers.getlist('Cookie')

+1

답변 해 주셔서 감사합니다. 불행히도 여전히 효과가 없었습니다. 안녕하세요, 쿠키가 있는지 압니다. 내가 한 일에 대해서는 아래의 게시물을 참조하십시오. – mikolune

+0

내 답변을 보려면 원래 게시물을 수정하십시오! 많은 감사합니다 :) – mikolune

+0

@mikolune, 업데이트를 참조하십시오. 또한 소스 코드를 살펴 보는 것도 잊지 마세요. 파이썬이 좋은 이유입니다. 소스 코드를 살펴볼 수도 있습니다. – warvariuc

12

시도 로그인에 성공한 후 이 새 세션 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 
관련 문제