2012-01-03 6 views
17

Я пытаюсь получить доступ к куки-файлу сессии в паук. Я сперва войти в социальную сеть, используя в пауке:Доступ к сеансу cookie в scrapy spiders

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 не возвращает куки сессии.

Как я могу получить файлы cookie сеанса? Я смотрел на промежуточное программное обеспечение для печенья: scrapy.contrib.downloadermiddleware.cookies и scrapy.http.cookies, но, похоже, нет простого способа получить доступ к сеансовым файлам cookie.

Некоторые подробности здесь бой мой первоначальный вопрос:

К сожалению, я использовал вашу идею, но я dind't увидеть печенье, хотя я знаю, что они существуют, так как scrapy.contrib.downloadermiddleware .cookies промежуточное программное обеспечение распечатывает файлы cookie! Это именно те куки, которые я хочу захватить.

Так вот что я делаю:

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.......... 

Так что я хотел бы получить словарь, содержащий ключи ххх, уу y и т. д. с соответствующими значениями.

Спасибо :)

+0

ли я правильно понимаю, что вы хотите проверить подлинность на Facebook, но скрести данные из другого домена, проверка подлинности на Facebook? – 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 имеет некоторые полезные методы.

Если вы все еще не видите файлы cookie - может быть, их там нет?


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

+0

Пожалуйста, посмотрите мои изменения в исходное сообщение, чтобы увидеть мой ответ! Большое спасибо :) – mikolune

+0

@mikolune, см. Обновление. Кроме того, научитесь изучать исходный код - вот почему Python хорош - вы можете изучить исходный код, который иногда является лучшей документацией. – warvariuc

12

Классический пример, имеющий сервер входа в систему, которая обеспечивает новый идентификатор сессии после успешного входа в систему. Этот новый идентификатор сеанса должен использоваться с другим запросом.

Вот код, взятый из источника, который, кажется, работает на меня.

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