Python 使用scrapy捕获HTTP错误

Python 使用scrapy捕获HTTP错误,python,web-scraping,scrapy,scrapy-spider,Python,Web Scraping,Scrapy,Scrapy Spider,我正试图从一个网站上搜寻断开的链接,到目前为止,我有一段代码,成功登录并爬网该网站,但它只记录了HTTP状态200代码: class HttpStatusSpider(scrapy.Spider): name = 'httpstatus' handle_httpstatus_all = True link_extractor = LinkExtractor() def start_requests(self): """This method e

我正试图从一个网站上搜寻断开的链接,到目前为止,我有一段代码,成功登录并爬网该网站,但它只记录了HTTP状态200代码:

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

    link_extractor = LinkExtractor()

    def start_requests(self):
        """This method ensures we login before we begin spidering"""
        # Little bit of magic to handle the CSRF protection on the login form
        resp = requests.get('http://localhost:8000/login/')
        tree = html.fromstring(resp.content)
        csrf_token = tree.cssselect('input[name=csrfmiddlewaretoken]')[0].value

        return [FormRequest('http://localhost:8000/login/', callback=self.parse,
                            formdata={'username': 'mischa_cs',
                                      'password': 'letmein',
                                      'csrfmiddlewaretoken': csrf_token},
                            cookies={'csrftoken': resp.cookies['csrftoken']})]

    def parse(self, response):
        item = HttpResponseItem()
        item['url'] = response.url
        item['status'] = response.status
        item['referer'] = response.request.headers.get('Referer', '')
        yield item

        for link in self.link_extractor.extract_links(response):
            r = Request(link.url, self.parse)
            r.meta.update(link_text=link.text)
            yield r
和让我相信
handle\u httpstatus\u all=True
应该会导致scrapy将错误的请求传递给我的
parse
方法,但到目前为止,我还无法捕获任何请求

我还在不同的代码迭代中试验了
handle\u httpstatus\u list
和自定义
errback
处理程序


捕获scrapy遇到的HTTP错误代码需要做哪些更改?

handle\u httpstatus\u list
可以在spider级别上定义,但是
handle\u httpstatus\u all
只能在
请求
级别上定义,包括在
meta
参数上


我仍然建议在这些情况下使用
errback
,但如果一切都得到控制,就不会产生新的问题。

handle\u httpstatus\u列表可以在spider级别定义,但是
handle\u httpstatus\u all
只能在
请求级别定义,将其包含在
meta
参数中


我仍然建议在这些情况下使用
errback
,但如果一切都得到控制,就不会产生新的问题。

因此,我不知道这是否是正确的方法,但它确实允许我处理所有HTTP状态码(包括5xx)

通过将此片段添加到我的scrapy项目的
设置.py
,我禁用了
HttpErrorMiddleware

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': None
}

因此,我不知道这是否是正确的scrapy方式,但它确实允许我处理所有HTTP状态代码(包括5xx)

通过将此片段添加到我的scrapy项目的
设置.py
,我禁用了
HttpErrorMiddleware

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': None
}

请删除
allowed_domains
参数,它不是必需的,它还可以过滤您的请求,也许这就是问题所在。我删除了
allowed_domains=['localhost']
但行为没有改变,我将
allowed_domains=['localhost']
放回,蜘蛛在tripadvisor上找到路径后:
2018-12-17 19:29:09[scrapy.core.scraper]调试:从
ok中刮取,那么现在我们面临另一个问题了?请检查我的回答请删除
allowed_domains
参数,它不是必需的,而且它还可以过滤您的请求,也许这就是问题所在我删除了
allowed_domains=['localhost']
但行为没有改变我将
allowed_domains=['localhost']
放回,蜘蛛在tripadvisor上找到路径后:
2018-12-17 19:29:09[scrapy.core.scraper]调试:从
ok中刮取,那么现在我们面临另一个问题了?请检查我的答案啊,很有趣。这是一个容易被忽略的差异,我现在可以看到4xx代码被捕获。但不确定5xx是否被捕获。下一步是尝试
errback
很高兴我帮助您获得了所需的http请求。啊,非常有趣。这是一个容易被忽略的差异,我现在可以看到4xx代码被捕获。但不确定5xx是否被捕获。下一步是尝试一个
errback
很高兴我帮助您获得了所需的http请求。当然,我会说这是一个很好的解决方案,但当然只是针对您的项目,我不认为在一个有很多爬行器的项目中,我们只需要对一些爬行器甚至请求禁用它就可以了。当然,我会说这是一个很好的解决方案,但当然,这只适用于您的项目,我不认为在一个有很多爬行器的项目中建议这样做,因为我们只需要对一些爬行器甚至请求禁用它。