簡體   English   中英

使用 SQLAlchemy 和 Scrapy 導出到 SQLite 時出錯

[英]Error exporting to SQLite using SQLAlchemy with Scrapy

我正在創建一個從 etf.com 收集 etf 數據的抓取機器人。 我正在嘗試將收集的數據導出到 sqlite 數據庫,但每次我這樣做時都會收到此錯誤消息(對於我嘗試添加的每個項目):

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type.
[SQL: INSERT INTO etf (ticker, name, issuer, aum, expense_ratio, tr, segment) VALUES (?, ?, ?, ?, ?, ?, ?)]
[parameters: (['ROKT'], ['SPDR S&P Kensho Final Frontiers ETF'], ['State Street Global Advisors'], ['$19.24M'], ['0.45%'], ['6.45%'], ['Equity: U.S. Space'])]

我的刮刀(brandetfs_spider.py):

for etf in etfs:
                    loader = ItemLoader(item=BrandetfsItem(), selector=etf)
                    loader.add_css('ticker', 'a.linkTickerName::text')
                    loader.add_css('name', 'td.col_2::text')
                    loader.add_css('issuer', 'td.col_3::text')
                    loader.add_css('aum', 'td.col_4::text')
                    loader.add_css('expense_ratio', 'td.col_5::text')
                    loader.add_css('tr', 'td.col_6::text')
                    loader.add_css('segment', 'td.col_7::text')

                    yield loader.load_item()

model:

Base = declarative_base()

def db_connect():
    """
    performs database connection using database settings from settings.py
    returns sqlalchemy engine instance
    """
    return create_engine(get_project_settings().get("CONNECTION_STRING")) # connects to a database

def create_table(engine):
    Base.metadata.create_all(engine)

class ETF(Base):
    __tablename__ = "etf"
    print("-------------------------------------------")

    id = Column(Integer, primary_key=True)
    ticker = Column('ticker', Text())
    name = Column('name', Text())
    issuer = Column('issuer', Text())
    aum = Column('aum', String(10))
    expense_ratio = Column('expense_ratio', Text())
    tr = Column('tr', Text())
    segment = Column('segment', Text())

管道:

class BrandetfsPipeline(object):
    def __init__(self):
        """
        Initializes database connection and sessionmaker
        creates tables
        """
        engine = db_connect()
        create_table(engine)
        self.Session = sessionmaker(bind=engine)

    def process_item(self, item, spider):
        """
        Save etfs in the database
        This method is called for every item pipeline component
        """
        session = self.Session()
        # create etf table
        etf = ETF()
        etf.ticker = item["ticker"]
        etf.name = item["name"]
        etf.issuer = item["issuer"]
        etf.aum = item["aum"]
        etf.expense_ratio = item["expense_ratio"]
        etf.tr = item["tr"]
        etf.segment = item["segment"]

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

        return item

設置.py:

CONNECTION_STRING = 'sqlite:///scrapy_etfs.db' 

我不明白為什么我會收到錯誤消息,因為我正在為數據庫字段使用文本類型,這就是我要輸入的內容

這可能是因為 itemloader 返回列表。 您可以使用TakeFirst作為處理器來修復它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM