目前我的基于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
答案 0 :(得分:0)
我认为你应该:
UNIQUE
上添加link
约束db.query(Listitem).filter_by(link=item.link).first() is None
您的机制可以用作优化 - 如果您在实例缓存中找到副本,则无需运行查询。但如果没有副本,请运行查询。