Как перехватить ответ scrapy от паука в конвейер?

Мне нужен весь ответ scrapy с настройками, трубопроводами, урлами и всем, что находится в трубопроводе, где я создаю объекты модели? Есть ли способ поймать это?

pipeline.py


class ScraperPipeline(object):
    def process_item(self, item, spider):
        logger = get_task_logger("logs")
        logger.info("Pipeline activated.")
        id = item['id'][0]
        user= item['user'][0]
        text = item['text'][0]
        Mail.objects.create(user=User.objects.get_or_create(
            id=id, user=user),
            text=text, date=today)
        logger.info(f"Pipeline disacvtivated")
spider.py
class Spider(CrawlSpider):
    name = 'spider'
    allowed_domains = ['xxx.com']

    def start_requests(self):
        urls = [
            'xxx.com',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse,
                                 headers={'User-Agent':
                                              'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
                                              'like Gecko) Chrome/107.0.0.0 Safari/537.36'})

    def parse(self, response):
        item = MailItem()
        for row in response.xpath('xpath thins'):
            ip['id'] = row.xpath('td[1]//text()').extract_first(),
            ip['user'] = row.xpath('td[2]//text()').extract_first(),
            ip['text'] = row.xpath('td[3]//text()').extract_first(),
            yield item

Я пытался вызвать ответ из конвейера, но у меня есть только объект. Также мне не хватает вещей из созданного объекта. Есть идеи?

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

Например:

class SpiderClass(scrapy.Spider):
    ...
    ...

    def parse(self, response):
        for i in response.xpath(...):
            field1 = ...
            yield {'field1': field1, 'response': response}

Затем в вашем конвейере вы будете иметь доступ к ответу как к полю элемента в методе process_item. Вы также можете получить доступ к настройкам из этого метода, используя атрибут crawler аргумента spider.

Например:

class MyPipeline:

    def process_item(self, item, spider):
        response = item['response']
        request = response.request
        settings = spider.crawler.settings
        ...   do something 
        del item['response']
        return item

Затем вам просто нужно активировать трубопровод в настройках.

Вернуться на верх