Scrapy和DuplicatesPipeline避免将重复项保存到db

时间:2015-01-15 14:01:46

标签: python sqlalchemy scrapy

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

中使用“class DuplicatesPipeline(object):”

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

可能类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

1 个答案:

答案 0 :(得分:0)

我认为你应该:

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

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