Проблема в том, что по умолчанию Scrapy не вызывает ваши обратные вызовы, если пауку возвращается код ответа об ошибке. Чтобы ваши обратные вызовы вызывались даже для кодов ответов, таких как 404
, 500
и т. Д., Вы должны передать эти два ключа в аргументе запроса meta
:
handle_httpstatus_all
: когда True
, scrapy не будет обрабатывать неверный код ответа как ошибку, и будет вызывать ваш обратный вызов для обработки такого ответа.
dont_retry
: когда True
, scrapy не будет повторять запрос при получении повторяемого ответа.
Ваш паук может быть чем-то вроде этого:
class YourSpider(scrapy.Spider):
name = 'yourspider'
your_list_of_urls = [
...
]
def start_requests(self):
for url in self.your_list_of_urls:
yield scrapy.Request(
url,
callback=self.parse_info,
meta={
'handle_httpstatus_all': True,
'dont_retry': True,
},
)
def parse_info(self, response):
yield {
'url': response.url,
'content': response.text,
'status': response.status,
}