Call the request callback or errback with the response or failure. .. versionadded:: 2.13
(
self, result: Response | Failure, request: Request
)
| 303 | return deferred_from_coro(self.call_spider_async(result, request)) |
| 304 | |
| 305 | async def call_spider_async( |
| 306 | self, result: Response | Failure, request: Request |
| 307 | ) -> Iterable[Any] | AsyncIterator[Any]: |
| 308 | """Call the request callback or errback with the response or failure. |
| 309 | |
| 310 | .. versionadded:: 2.13 |
| 311 | """ |
| 312 | await _defer_sleep_async() |
| 313 | assert self.crawler.spider |
| 314 | if isinstance(result, Response): |
| 315 | if getattr(result, "request", None) is None: |
| 316 | result.request = request |
| 317 | assert result.request |
| 318 | callback = result.request.callback or self.crawler.spider._parse |
| 319 | warn_on_generator_with_return_value(self.crawler.spider, callback) |
| 320 | output = callback(result, **result.request.cb_kwargs) |
| 321 | if isinstance(output, Deferred): |
| 322 | warnings.warn( |
| 323 | f"{callback} returned a Deferred." |
| 324 | f" Returning Deferreds from spider callbacks is deprecated.", |
| 325 | ScrapyDeprecationWarning, |
| 326 | stacklevel=2, |
| 327 | ) |
| 328 | else: # result is a Failure |
| 329 | # TODO: properly type adding this attribute to a Failure |
| 330 | result.request = request # type: ignore[attr-defined] |
| 331 | if not request.errback: |
| 332 | result.raiseException() |
| 333 | warn_on_generator_with_return_value(self.crawler.spider, request.errback) |
| 334 | output = request.errback(result) |
| 335 | if isinstance(output, Failure): |
| 336 | output.raiseException() |
| 337 | # else the errback returned actual output (like a callback), |
| 338 | # which needs to be passed to iterate_spider_output() |
| 339 | if isinstance(output, Deferred): |
| 340 | warnings.warn( |
| 341 | f"{request.errback} returned a Deferred." |
| 342 | f" Returning Deferreds from spider errbacks is deprecated.", |
| 343 | ScrapyDeprecationWarning, |
| 344 | stacklevel=2, |
| 345 | ) |
| 346 | return await ensure_awaitable(iterate_spider_output(output)) |
| 347 | |
| 348 | def handle_spider_error( |
| 349 | self, |
no test coverage detected