2017-10-19 17 views
1

J'essaye d'obtenir le code de statut de demande avec le scrapy et le scrapy-splash, ci-dessous est le code d'araignée.comment obtenir le code de statut autre que 200 de scrapy-splash

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) 

Mon départ url http://192.168.8.240:8000/xxxx est une URL de code d'état 404, il y a threee sortes de façon à demander à:

la première est:

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

le second est:

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

le troisième est:

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

Seule la deuxième demande façon yield scrapy.Request(url, self.parse, meta={'handle_httpstatus_all': True}) peut obtenir le code d'état 404, le premier et le troisième à la fois obtenir le code d'état 200, c'est-à-dire après que j'essaie d'utiliser scrapy -splash, je ne peux pas obtenir le bon code de statut 404, pouvez-vous m'aider?

Répondre

1

Comme le documentation-scrapy-splash suggère, vous devez passer magic_response=True-SplashRequest pour y parvenir:

meta['splash']['http_status_from_error_code'] - mettre response.status au code d'erreur HTTP lorsque assert(splash:go(..)) échoue; il faut meta['splash']['magic_response']=True. L'option http_status_from_error_code est False par défaut si vous utilisez une API méta brute; SplashRequest le définit à True par défaut.

EDIT: j'ai pu le faire fonctionner uniquement avec execute point final, bien que. Voici araignée échantillon qui teste le code d'état HTTP à l'aide 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 

Il passe le code d'état HTTP 402 à Scrapy, comme on le voit à la sortie:

... 
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) 
... 

Vous pouvez expérimenter avec d'autres HTTP codes d'état aussi bien.

+0

J'essaie d'utiliser le code ci-dessous avec http_status_from_error_code = True, mais échoue toujours. '' 'rendement scrapy.Request (url, self.parse, meta = { 'handle_httpstatus_all': True, 'splash': { 'args': { 'html': 1, '': 1 .png, }, 'magic_response': Il est vrai 'http_status_from_error_code': True }} ) '' ' –

+0

Pourquoi ne pas utiliser' SplashRequest'? C'est la manière recommandée d'utiliser Splash avec Scrapy. –

+0

J'essaie d'utiliser SplashRequest avec le code ci-dessous, mais échoue toujours.'yield SplashRequest (url, self.parse, args = {'wait': 0.5, 'dont_redirect': vrai}, meta = {'handle_httpstatus_all': True}) 'Je l'utilise pas correctement? –