Доступ к сессионному файлу cookie в паутинах - PullRequest
17 голосов
/ 03 января 2012

Я пытаюсь получить доступ к сессионному куки в пауке. Сначала я захожу в социальную сеть, используя паука:

    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: scrapy.contrib.downloadermiddleware.cookies и scrapy.http.cookies , но, похоже, нет простого способа доступа к сеансовым cookie.

Более подробная информация о моем первоначальном вопросе:

К сожалению, я использовал вашу идею, но я не вижу куки, хотя я точно знаю, что они существуют, так как промежуточное ПО scrapy.contrib.downloadermiddleware.cookies действительно распечатывает куки! Это именно те куки, которые я хочу получить.

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

Метод after_login (self, response) получает переменную 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 и т. Д. С соответствующими значениями.

Спасибо:)

Ответы [ 2 ]

12 голосов
/ 12 октября 2015

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

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

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 
6 голосов
/ 03 января 2012

Может быть, это излишнее, но я не знаю, как вы собираетесь использовать эти куки, поэтому это может быть полезно (выдержка из реального кода - адаптируйте его к вашему случаю):

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')

...