Как остановить scrapy от пагинации страниц с повторяющимися записями?

Я пытался проползти по сайту с белой пагинацией с помощью scrapy, и это было нормально! Но поскольку этот сайт обновляется и на него добавляются новые посты, мне нужно запускать мой код каждый день, поэтому каждый раз, когда я запускаю свой код, он переползает все страницы. К счастью, я использую django, и в моей модели django я использовал

unique=True

Итак, в моей базе данных нет дубликатов записей, но я хочу остановить ползание пагинации, как только она обнаружит дубликат записи. как мне это сделать? вот мой код сниппета паука:

    def parse(self, response, **kwargs):
        next_page = response.xpath('//a[@class="next page-numbers"]/@href').get()

        news_links = response.xpath('//div[@class="content-column"]/div/article/div/div[1]/a/@href').getall()
        # print('*'*50)
        for link in news_links:
            yield scrapy.Request(url=link, callback=self.parse_item)

        if next_page:
            yield scrapy.Request(url=next_page, callback=self.parse)


    def parse_item(self, response):
        item = CryptocurrencyNewsItem()
        ...
        return item

Если вы хотите остановить паука после выполнения определенных критериев, вы можете поднять CloseSpider

    if some_logic_to_check_duplicates:
        raise CloseSpider('Duplicate records found') 
        # This message shows up in the logs

Если вы просто хотите пропустить дублирующий элемент, вы можете поднять исключение DropItem из конвейера. Пример кода из документов по Scrapy:

class DuplicatesPipeline:

    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        adapter = ItemAdapter(item)
        if adapter['id'] in self.ids_seen:
            raise DropItem(f"Duplicate item found: {item!r}")
        else:
            self.ids_seen.add(adapter['id'])
            return item
Вернуться на верх