2017-01-03 6 views
1

Ich versuche auf Cookies zuzugreifen, nachdem ich eine Anfrage mit Splash gestellt habe. Unten ist, wie ich die Anfrage erstellen.Lesen Sie Cookies von Splash Anfrage

script = """ 
function main(splash) 
    splash:init_cookies(splash.args.cookies) 
    assert(splash:go{ 
    splash.args.url, 
    headers=splash.args.headers, 
    http_method=splash.args.http_method, 
    body=splash.args.body, 
    }) 
    assert(splash:wait(0.5)) 

    local entries = splash:history() 
    local last_response = entries[#entries].response 
    return { 
    url = splash:url(), 
    headers = last_response.headers, 
    http_status = last_response.status, 
    cookies = splash:get_cookies(), 
    html = splash:html(), 
    } 
end 
""" 
req = SplashRequest(
    url, 
    self.parse_page, 
    args={ 
     'wait': 0.5, 
     'lua_source': script, 
     'endpoint': 'execute' 
    } 
) 

Das Skript ist eine genaue Kopie von Splash Dokumentation.

Also versuche ich auf die Cookies zuzugreifen, die auf der Webseite eingestellt sind. Wenn ich Splash nicht verwende, funktioniert der Code unten, wie ich es erwarte, aber nicht wenn ich Splash benutze.

self.logger.debug('Cookies: %s', response.headers.get('Set-Cookie')) 

Dies gibt während Splash mit:

2017-01-03 12:12:37 [spider] DEBUG: Cookies: None

Wenn ich nicht Splash mit diesem Code funktioniert und gibt die von der Webseite zur Verfügung steht Cookies.

Die Dokumentation von Splash zeigt diesen Code als Beispiel:

def parse_result(self, response): 
    # here response.body contains result HTML; 
    # response.headers are filled with headers from last 
    # web page loaded to Splash; 
    # cookies from all responses and from JavaScript are collected 
    # and put into Set-Cookie response header, so that Scrapy 
    # can remember them. 

Ich bin nicht sicher, ob ich das richtig bin zu verstehen, aber ich würde sagen, dass ich in der Lage sein sollte, die Cookies in den gleichen zugreifen So wie wenn ich kein Splash benutze.

Einstellungen Middleware:

# Download middlewares 
DOWNLOADER_MIDDLEWARES = { 
    # Use a random user agent on each request 
    'crawling.middlewares.RandomUserAgentDownloaderMiddleware': 400, 
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700, 
    # Enable crawlera proxy 
    'scrapy_crawlera.CrawleraMiddleware': 600, 
    # Enable Splash to render javascript 
    'scrapy_splash.SplashCookiesMiddleware': 723, 
    'scrapy_splash.SplashMiddleware': 725, 
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, 
} 

So ist meine Frage: Wie kann ich Cookies, während ein Splash Anfrage mit?

Settings.py

spider.py

Antwort

0

können Sie SPLASH_COOKIES_DEBUG=True Option alle Cookies, um zu sehen, die eingestellt werden. Der aktuelle cookiejar mit allen zusammengeführten Cookies ist als response.cookiejar verfügbar, wenn scrapy-splash korrekt konfiguriert ist. Die Verwendung von response.headers.get('Set-Header') ist nicht robust, da im Falle von Weiterleitungen (z. B. JS-Weiterleitungen) mehrere Antworten vorhanden sein können und ein Cookie in der ersten gesetzt werden kann, während das Skript nur für die letzte Antwort Header zurückgibt.

Ich bin mir nicht sicher, ob dies ein Problem ist, das Sie haben; Der Code ist keine exakte Kopie von Splash-Dokumenten. Hier:

req = SplashRequest(
    url, 
    self.parse_page, 
    args={ 
     'wait': 0.5, 
     'lua_source': script 
    } 
) 

Sie senden Anfrage an den /render.json Endpunkt; Es führt keine Lua-Skripte aus; Verwenden Sie endpoint='execute', um das zu beheben.

+0

Ich habe den Endpunkt der Anfrage hinzugefügt, aber ohne Ergebnis. Das response.headers.get ('Set-Cookie') gibt immer noch einen NoneType zurück. Für den response.cookiejar bekomme ich einen Fehler: AttributeError: 'SplashTextResponse' Objekt hat kein Attribut 'cookiejar' – Casper

+0

@Casper - Sind Sie sicher, dass alle beschriebenen Optionen in Ihrer settings.py gesetzt sind? Ist 'scrapy_splash.SplashCookiesMiddleware' zu' DOWNLOADER_MIDDLEWARES' hinzugefügt? –

+0

Ich habe die Frage mit der Einstellungsvariable DOWNLOADER_MIDDLEWARES aktualisiert. – Casper

Verwandte Themen