2017-01-03 3 views
1

스플래시를 사용하여 요청한 후에 쿠키에 액세스하려고합니다. 다음은 요청을 작성한 방법입니다.스플래시 요청에서 쿠키 읽기

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

스크립트는 Splash 설명서의 사본입니다.

그래서 웹 페이지에 설정된 쿠키에 액세스하려고합니다. 스플래시를 사용하지 않을 때는 아래 코드가 예상대로 작동하지만 스플래시는 사용하지 않습니다. 플래쉬를 사용하는 동안

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

이 반환 : 나는 플래쉬를 사용하지 않는 경우

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

이 코드가 작동하고 웹 페이지에서 제공하는 쿠키를 반환합니다.

스플래쉬의 문서는 예제로이 코드를 보여줍니다

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. 

내가 올바르게 이해 해요 여부를 모르겠어요,하지만 난 같은에서 쿠키를 액세스 할 수 있어야합니다라고 말하고 싶지만 내가 스플래쉬를 사용하지 않을 때처럼.

미들웨어 설정 :

# 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, 
} 

그래서 내 질문은 : 스플래시 요청을 사용하는 동안 어떻게 쿠키를 액세스합니까?

Settings.py

spider.py

답변

0

당신은 설정되고 모든 쿠키를 볼 수 SPLASH_COOKIES_DEBUG=True 옵션을 설정할 수 있습니다. scrapy-splash이 올바르게 구성된 경우 모든 쿠키가 병합 된 현재 쿠키가 response.cookiejar으로 제공됩니다.

response.headers.get('Set-Header')을 사용하면 리디렉션 (예 : JS 리디렉션)의 경우 여러 개의 응답이있을 수 있고 첫 번째에는 쿠키가 설정 될 수 있고 스크립트는 마지막 응답에 대해서만 헤더를 반환하기 때문에 강력하지 않습니다.

이것이 문제가되는지 확실하지 않습니다. 코드는 스플래시 문서와 정확히 일치하지 않습니다. 여기 :

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

끝점 /render.json으로 요청을 보내고 있습니다. 루아 스크립트를 실행하지 않습니다. 이를 수정하려면 endpoint='execute'을 사용하십시오.

+0

요청에 엔드 포인트를 추가했으나 결과가 없습니다. response.headers.get ('Set-Cookie')는 여전히 NoneType을 반환합니다. response.cookiejar에 대해 오류가 발생했습니다. AttributeError : 'SplashTextResponse'객체에 'cookiejar'속성이 없습니다. – Casper

+0

@Casper - 설명한 모든 옵션이 settings.py에 설정되어 있습니까? 'scrapy_splash.SplashCookiesMiddleware'가'DOWNLOADER_MIDDLEWARES'에 추가 되었습니까? –

+0

질문을 DOWNLOADER_MIDDLEWARES 설정 변수로 업데이트했습니다. – Casper