2016-09-25 2 views
2

Я использую scrapy-splash для создания своего паука. Теперь мне нужно поддерживать сеанс, поэтому я использую scrapy.downloadermiddlewares.cookies.CookiesMiddleware и обрабатывает заголовок set-cookie. Я знаю, что он обрабатывает заголовок set-cookie, потому что я устанавливаю COOKIES_DEBUG = True, и это вызывает распечатки CookeMiddleware в отношении заголовка set-cookie.scrapy-splash возвращает свои собственные заголовки, а не исходные заголовки с сайта

Проблема: когда я также добавляю Splash к картинке, распечатки set-cookie исчезают, и на самом деле то, что я получаю в качестве заголовков ответов, равно {'Date': ['Sun, 25 Sep 2016 12:09:55 GMT '],' Content-Type ': [' text/html; charset = utf-8 '],' Server ': [' TwistedWeb/16.1.1 ']} Что связано с механизмом рендеринга брызг, который использует TwistedWeb.

Есть ли какая-либо директива, чтобы сообщить всплеск, чтобы дать мне исходные заголовки ответов?

ответ

3

Для получения исходных заголовков ответов вы можете написать Splash Lua script; см examples в SCRAPY-выплеска README:

Используйте скрипт Lua, чтобы получить ответ HTML с печеньем, заголовки, тело и метод набора для корректировки значений; Значение lua_source аргумент кэшируется на сервере Всплеск и не передается с каждым запросом (это требует Всплеск 2.1+):

import scrapy 
from scrapy_splash import SplashRequest 

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

class MySpider(scrapy.Spider): 


    # ... 
     yield SplashRequest(url, self.parse_result, 
      endpoint='execute', 
      cache_args=['lua_source'], 
      args={'lua_source': script}, 
      headers={'X-My-Header': 'value'}, 
     ) 

    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. 

SCRAPY разбрызгивание также обеспечивает built-in helpers для обработки печенья; они включены в этом примере, как только scrapy-splash равен configured, как описано в readme.

Смежные вопросы