2017-10-19 55 views
1

我正在嘗試使用scrapy和scrapy-splash獲取請求狀態代碼,下面是spider代碼。如何從scrapy-splash獲取200以外的狀態代碼

class Exp10itSpider(scrapy.Spider): 
    name = "exp10it" 

    def start_requests(self): 
     urls = [ 
       'http://192.168.8.240:8000/xxxx' 
     ] 
     for url in urls: 
      #yield SplashRequest(url, self.parse, args={'wait': 0.5, 'dont_redirect': True},meta={'handle_httpstatus_all': True}) 
      #yield scrapy.Request(url, self.parse, meta={'handle_httpstatus_all': True}) 
      yield scrapy.Request(url, self.parse, meta={'handle_httpstatus_all': True,'splash': { 
       'args': { 
        'html': 1, 
        'png': 1, 
        } 
      } 
      } 
      ) 


    def parse(self, response): 
     input("start .........") 
     print("status code is:\n") 
     input(response.status) 

我的起始URL http://192.168.8.240:8000/xxxx是404個狀態碼的網址,也有在threee種請求方式:

第一個是:

yield SplashRequest(url, self.parse, args={'wait': 0.5, 'dont_redirect': True},meta={'handle_httpstatus_all': True})

第二個是:

yield scrapy.Request(url, self.parse, meta={'handle_httpstatus_all': True})

第三個是:

yield scrapy.Request(url, self.parse, meta={'handle_httpstatus_all': True,'splash': { 'args': { 'html': 1, 'png': 1, } } } )

只有第二個請求的方式yield scrapy.Request(url, self.parse, meta={'handle_httpstatus_all': True})可以得到正確的狀態代碼404,第一和第三都得到狀態代碼200,這是說,以後我嘗試使用scrapy -splash,我無法獲得正確的狀態代碼404,你能幫我嗎?

回答

1

由於documentationscrapy-splash建議,你必須通過magic_response=TrueSplashRequest來實現這一目標:

meta['splash']['http_status_from_error_code'] - 設置response.status到HTTP錯誤代碼時assert(splash:go(..))失敗;它需要meta['splash']['magic_response']=Truehttp_status_from_error_code默認情況下,選項爲False;如果您使用原始元API; SplashRequest默認設置爲True

編輯: 我能得到它的只有execute端點工作,雖然。下面是使用HTTP狀態代碼httpbin.org測試樣品蜘蛛:

# -*- coding: utf-8 -*- 
import scrapy 
import scrapy_splash 

class HttpStatusSpider(scrapy.Spider): 
    name = 'httpstatus' 

    lua_script = """ 
    function main(splash, args) 
     assert(splash:go(args.url)) 
     assert(splash:wait(0.5)) 
     return { 
     html = splash:html(), 
     png = splash:png(), 
     } 
    end 
    """ 

    def start_requests(self): 
     yield scrapy_splash.SplashRequest(
      'https://httpbin.org/status/402', self.parse, 
      endpoint='execute', 
      magic_response=True, 
      meta={'handle_httpstatus_all': True}, 
      args={'lua_source': self.lua_script}) 

    def parse(self, response): 
     pass 

它通過HTTP 402狀態代碼到Scrapy,如可以從輸出可以看出:

... 
2017-10-23 08:41:31 [scrapy.core.engine] DEBUG: Crawled (402) <GET https://httpbin.org/status/402 via http://localhost:8050/execute> (referer: None) 
... 

可以與其他HTTP實驗狀態碼。

+0

我嘗試使用下面的代碼,http_status_from_error_code = True,但仍然失敗。 'yield scrapy.Request(url,self.parse,meta = {'handle_httpstatus_all':True,'splash':{ 'args':{ 'html':1, 'png':1, }, 'magic_response':True, 'http_status_from_error_code':True } } )''' –

+0

爲什麼不使用'SplashRequest'?這是與Scrapy一起使用Splash的推薦方式。 –

+0

我嘗試使用下面的代碼SplashRequest,但仍然失敗.'yield SplashRequest(url,self.parse,args = {'wait':0.5,'dont_redirect':True},meta = {'handle_httpstatus_all':True}) '我使用不正確? –