Захват ошибок HTTP с помощью scrapy - PullRequest
0 голосов
/ 17 декабря 2018

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

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

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': None
}
0 голосов
/ 17 декабря 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...