如何在scrapy中使用CrawlSpider处理http错误代码

问题描述 投票:0回答:2

我正在尝试使用scrapy来测试一些网站及其子网站的http返回码,以及检测400和500范围内的错误。不过我还想看到并处理300范围内的代码。我已经尝试了几天并检查文档,但是我被困住了,没有找到解决方案。谢谢你的帮助!

下面你将看到我使用CrawlSpider创建的蜘蛛。目标是在我的parse_item()函数中查看/捕获错误范围内的http响应。我已经在settings.py中添加了handle_httpstatus_all = True,但是除了HTTP_STATUS = 200之外什么都没有进入parse_item。

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy import log


class IcrawlerSpider(CrawlSpider):

name = 'icrawler'
def __init__(self, *args, **kwargs):
    # We are going to pass these args from our django view.
    # To make everything dynamic, we need to override them inside__init__method
    handle_httpstatus_all = True
    self.url = kwargs.get('url')
    self.domain = kwargs.get('domain')
    self.start_urls = [self.url]
    self.allowed_domains = [self.domain]

    IcrawlerSpider.rules = [
       Rule(LinkExtractor(unique=True), callback='parse_item'),
    ]
    super(IcrawlerSpider, self).__init__(*args, **kwargs)

def parse_item(self, response):
    # You can tweak each crawled page here
    # Don't forget to return an object.
    if response.status==403:
        self.logger.errror("ERROR_CODE_RETURNED: " + response.status)
    i = {}
    i['url'] = response.url
    i['status_code'] = response.status
    return i

最有可能的是,当涉及到没有错误代码被传递的原因时,我错过了一些基本的东西。

python scrapy http-error
2个回答
3
投票

标志handle_httpstatus_all应该在你的每个请求的meta中设置,检查文档here

关于设置,您可以使用HTTPERROR_ALLOW_ALL或设置HTTPERROR_ALLOWED_CODES列表。

像这样:

class IcrawlerSpider(CrawlSpider):
    name = 'icrawler'
    custom_settings = {'HTTPERROR_ALLOW_ALL': True}

或者重构你的蜘蛛来调用像yield Request(link, self.parse_item, meta={'handle_httpstatus_all': True})这样的请求我不知道如何将meta参数应用于规则。


0
投票

如果您需要使用规则执行此操作,则可以通过提供process_request回调来修改生成的请求。这是一个总结:

class IcrawlerSpider(CrawlSpider):
    def __init__(self, *args, **kwargs):
        # ...
        IcrawlerSpider.rules = [
           Rule(LinkExtractor(unique=True), callback='parse_item', process_request='add_meta'),
        ]

    def add_meta(self, request):
        request.meta['handle_httpstatus_all'] = True
        return request

请参阅documentationexample

© www.soinside.com 2019 - 2024. All rights reserved.