Как обрабатывать коды ошибок http, используя CrawlSpider в scrapy - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать scrapy для проверки некоторых веб-сайтов и их дочерних сайтов на наличие кодов возврата http, чтобы обнаружить ошибки в диапазоне 400 и 500.Однако я также хотел бы видеть и обрабатывать коды в диапазоне 300.Я пытался в течение нескольких дней и проверял документы, однако я застрял и не могу найти решение.Спасибо за помощь!

После вы увидите паука, которого я создаю с помощью CrawlSpider.Цель состоит в том, чтобы увидеть / перехватить ответы http в диапазонах ошибок в моей функции parse_item ().Я добавил handle_httpstatus_all = True в settings.py, но ничего, кроме 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

Скорее всего, я упускаю что-то элементарное, когда дело доходит до причины, по которой не передаются коды ошибок.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Если вам нужно сделать это с правилами, то вы можете изменить сгенерированные запросы, предоставив обратный вызов 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

См. Документацию и пример .

0 голосов
/ 14 февраля 2019

Флаг handle_httpstatus_all должен быть установлен в meta каждого вашего запроса, проверьте документы здесь .

О настройках, вы можете играть с 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}) Я не знаю, как применять метапараметры к Правилам.

...