Как остановить 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