Scrapy 和 DuplicatesPipeline 避免将重复项保存到数据库

Scrapy and DuplicatesPipeline avoid saving duplicates to db

目前我的基于 Scrapy 库的蜘蛛正在抓取 url(这个 url 每分钟更新一次新项目)并将新闻列表项目保存到数据库中,该列表每小时更新一次,我我试图通过在我的 pipelines.py

中使用 "class DuplicatesPipeline(object):" 来避免添加这些新闻条目的重复项

目前我的脚本正在将新闻项保存到数据库中,但它仍然保存重复项。

可能 class DuplicatesPipeline 是错误的方法,因为它似乎不检查数据库中的现有记录,它只检查当前会话中的重复项。

非常感谢您的帮助


型号:

class Listitem(DeclarativeBase):
    """Sqlalchemy deals model"""
    __tablename__ = "newsitems"

    id = Column(Integer, primary_key=True)
    title = Column('title', String)
    description = Column('description', String, nullable=True)
    link = Column('link', String, nullable=True)
    date = Column('date', String, nullable=True)


Pipelines.py:

from sqlalchemy.orm import sessionmaker
from models import Presstv, db_connect, create_presstv_table
from scrapy import signals
from scrapy.exceptions import DropItem




class PressTvPipeline(object):

    def __init__(self):
        """
        Initializes database connection and sessionmaker.
        Creates deals table.
        """
        engine = db_connect()
        create_presstv_table(engine)
        self.Session = sessionmaker(bind=engine)




    def process_item(self, item, spider):
        """Save deals in the database.

        This method is called for every item pipeline component.

        """
        session = self.Session()
        deal = Presstv(**item)

        try:
            session.add(deal)
            session.commit()
        except:
            session.rollback()
            raise
        finally:
            session.close()

        return item

我认为你应该:

  • 在你的数据库link上添加一个UNIQUE约束
  • 检查管道中类似 db.query(Listitem).filter_by(link=item.link).first() is None 的内容

您的机制可用作优化 - 如果您在实例缓存中找到副本,则无需 运行 查询。但是如果没有copy,运行查询。