如何从scrapy-splash获取200以外的状态代码

时间:2017-10-19 15:07:08

标签: python-3.x scrapy scrapy-splash

我正在尝试使用scrapy和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)

我的开始网址http://192.168.8.240:8000/xxxx是404状态代码网址,有三种请求方式:

第一个是:

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 个答案:

答案 0 :(得分:1)

正如documentationscrapy-splash建议的那样,您必须将magic_response=True传递给SplashRequest才能实现此目标:

  

meta['splash']['http_status_from_error_code'] - response.status失败时将assert(splash:go(..))设置为HTTP错误代码;它需要meta['splash']['magic_response']=True。如果您使用原始元API,则http_status_from_error_code选项默认为False; SplashRequest默认将其设置为True

修改 不过,我能够让它只与execute端点一起工作。以下是使用httpbin.org测试HTTP状态代码的示例蜘蛛:

# -*- 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状态代码。