Захват ошибок HTTP с помощью scrapy

Я пытаюсь очистить веб-сайт на предмет неработающих ссылок, пока у меня есть этот код, который успешно выполняет вход в систему и сканирует сайт, но он записывает только коды состояния 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_httpstatus_all = True должен вызывать scrapy для передачи ошибочных запросов моему методу parse, но пока мне не удалось их захватить.

Я также экспериментировал с handle_httpstatus_list и пользовательским обработчиком errback в другой итерации кода.

Что мне нужно изменить, чтобы фиксировать коды ошибок HTTP, с которыми сталкивается scrapy?

пожалуйста, удалите аргумент allowed_domains, он не нужен, и он также может фильтровать ваши запросы, возможно, в этом проблема

eLRuLL 17.12.2018 20:13

Я удалил allowed_domains = ['localhost'] без каких-либо изменений в поведении

chrisbunney 17.12.2018 20:21

Я вставил allowed_domains = ['localhost'] обратно после того, как паук попал на tripadvisor: 2018-12-17 19:29:09 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.tripadvisor.co.uk/Restaurants-g186364-c31-zfp5-S‌​heffield_South_Yorks‌​hire_England.html>

chrisbunney 17.12.2018 20:30

хорошо, теперь мы столкнулись с другой проблемой? Пожалуйста проверьте мой ответ

eLRuLL 17.12.2018 20:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
57
2

Ответы 2

handle_httpstatus_list можно определить на уровне паука, но handle_httpstatus_all можно определить только на уровне Request, включая его в аргументе meta.

Я бы по-прежнему рекомендовал использовать errback для этих случаев, но если все находится под контролем, это не должно создавать новых проблем.

Ах, очень интересно. Это различие легко не заметить, и теперь я вижу, как записываются коды 4xx. Не уверен, что 5xx попадают в плен. Следующий шаг - попробовать errback.

chrisbunney 17.12.2018 20:34

Рад, что помог вам получить нужные HTTP-запросы.

eLRuLL 17.12.2018 20:36

Итак, я не знаю, правильный ли это способ scrapy, но он позволяет мне обрабатывать все коды состояния HTTP (включая 5xx).

Я отключил HttpErrorMiddleware, добавив этот фрагмент в settings.py моего проекта scrapy:

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

Конечно, я бы сказал, что это хорошее решение, но, конечно, только для вашего проекта, я не думаю, что это можно было бы рекомендовать в проекте с большим количеством пауков, где нам нужно отключить это только для некоторых пауков или даже запросов.

eLRuLL 20.12.2018 18:49

Другие вопросы по теме