Доступ к сеансовому файлу в scrapy spiders
Я пытаюсь получить доступ к файлу cookie сеанса внутри паука. Сначала я вхожу в социальную сеть, используя в пауке:
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 сеанса.
Как я могу получить файлы 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 и т.д. с соответствующими значениями.
Спасибо:)
Ответы
Ответ 1
Классическим примером является наличие сервера входа в систему, который предоставляет новый идентификатор сеанса после успешного входа в систему. Этот новый идентификатор сеанса должен использоваться с другим запросом.
Вот код, полученный из источника, который, похоже, работает для меня.
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
Ответ 2
Возможно, это перебор, но я не знаю, как вы собираетесь использовать эти файлы 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
имеет несколько полезных методов.
Если вы все еще не видите файлы 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')