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,运行查询。
目前我的基于 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,运行查询。