Send *item* to the item pipelines for processing. *response* is the source of the item data. If the item does not come from response data, e.g. it was hard-coded, set it to ``None``. .. versionadded:: 2.14
(
self, item: Any, *, response: Response | Failure | None
)
| 478 | return deferred_from_coro(self.start_itemproc_async(item, response=response)) |
| 479 | |
| 480 | async def start_itemproc_async( |
| 481 | self, item: Any, *, response: Response | Failure | None |
| 482 | ) -> None: |
| 483 | """Send *item* to the item pipelines for processing. |
| 484 | |
| 485 | *response* is the source of the item data. If the item does not come |
| 486 | from response data, e.g. it was hard-coded, set it to ``None``. |
| 487 | |
| 488 | .. versionadded:: 2.14 |
| 489 | """ |
| 490 | assert self.slot is not None # typing |
| 491 | assert self.crawler.spider is not None # typing |
| 492 | self.slot.itemproc_size += 1 |
| 493 | try: |
| 494 | if self._itemproc_has_async["process_item"]: |
| 495 | output = await self.itemproc.process_item_async(item) |
| 496 | else: |
| 497 | output = await maybe_deferred_to_future( |
| 498 | self.itemproc.process_item(item, self.crawler.spider) |
| 499 | ) |
| 500 | except DropItem as ex: |
| 501 | logkws = self.logformatter.dropped(item, ex, response, self.crawler.spider) |
| 502 | if logkws is not None: |
| 503 | logger.log( |
| 504 | *logformatter_adapter(logkws), extra={"spider": self.crawler.spider} |
| 505 | ) |
| 506 | await self.signals.send_catch_log_async( |
| 507 | signal=signals.item_dropped, |
| 508 | item=item, |
| 509 | response=response, |
| 510 | spider=self.crawler.spider, |
| 511 | exception=ex, |
| 512 | ) |
| 513 | except Exception as ex: |
| 514 | logkws = self.logformatter.item_error( |
| 515 | item, ex, response, self.crawler.spider |
| 516 | ) |
| 517 | logger.log( |
| 518 | *logformatter_adapter(logkws), |
| 519 | extra={"spider": self.crawler.spider}, |
| 520 | exc_info=True, |
| 521 | ) |
| 522 | await self.signals.send_catch_log_async( |
| 523 | signal=signals.item_error, |
| 524 | item=item, |
| 525 | response=response, |
| 526 | spider=self.crawler.spider, |
| 527 | failure=Failure(), |
| 528 | ) |
| 529 | else: |
| 530 | logkws = self.logformatter.scraped(output, response, self.crawler.spider) |
| 531 | if logkws is not None: |
| 532 | logger.log( |
| 533 | *logformatter_adapter(logkws), extra={"spider": self.crawler.spider} |
| 534 | ) |
| 535 | await self.signals.send_catch_log_async( |
| 536 | signal=signals.item_scraped, |
| 537 | item=output, |
no test coverage detected