Python:Sqlalchemy.exc.OperationalError:<;无法打印的错误对象>;

Python:Sqlalchemy.exc.OperationalError:<;无法打印的错误对象>;,python,mysql,scrapy,web-crawler,pipeline,Python,Mysql,Scrapy,Web Crawler,Pipeline,我编写了以下代码,我将在下面展示这些代码来创建一个网络爬虫(用scrapy详细说明),我想把这些数据放在一个数据库中,一个是mysql。为此,我使用管道文件并进行了以下配置: pipeline.py: class ScrapySpiderPipeline(object): def __init__(self): engine = db_connect() create_table(engine) self.Session = sessionmaker(bi

我编写了以下代码,我将在下面展示这些代码来创建一个网络爬虫(用scrapy详细说明),我想把这些数据放在一个数据库中,一个是mysql。为此,我使用管道文件并进行了以下配置:

  • pipeline.py:

    class ScrapySpiderPipeline(object):
       def __init__(self):
    
         engine = db_connect()
         create_table(engine)
         self.Session = sessionmaker(bind=engine)
    
      def process_item(self, item, spider):
    
         session = self.Session()
         quotedb = QuoteDB()
         quotedb.Titulo = item["Titulo"]
         quotedb.Tipo_Negocio = item["Tipo_Negocio"]
         quotedb.Preco = item["Preco"]
         quotedb.Tipo_Imovel = item["Tipo_Imovel"]
    
      try:
         session.add(quotedb)
         session.commit()
      except:
         session.rollback()
         raise
      finally:
         session.close()
    
      return item
    
  • models.py:

    from scrapy.utils.project import get_project_settings
    
    DeclarativeBase = declarative_base()
    
    def db_connect():
    return create_engine(get_project_settings().get("CONNECTION_STRING"))
    
    def create_table(engine):
       DeclarativeBase.metadata.create_all(engine)
    
    class QuoteDB(DeclarativeBase):
       __tablename__ = "imovel_table"
    
       id = Column(Integer, primary_key=True)
       Titulo = Column('Titulo', VARCHAR(200))
       Tipo_Negocio = Column('Tipo_Negocio', String(100))
       Preco = Column('Preco', Text())
       Tipo_Imovel = Column('Tipo_Imovel', Text())
    
    
    print(QuoteDB.__table__)
    
  • items.py:

    class QuoteItem(scrapy.Item):
      Titulo = scrapy.Field()
      Tipo_Negocio = scrapy.Field()
      Preco = scrapy.Field()
      Tipo_Imovel = scrapy.Field()
    
  • setting.py:

    ITEM_PIPELINES = {
       'novo.pipelines.ScrapySpiderPipeline' : 300,
    }
    
    CONNECTION_STRING = "{drivername}://{user}:{passwd}@{host}:{port}/{db_name}?charset=utf8".format(
       drivername="mysql",
       user="root",
       passwd="",
       host="localhost",
       port="3306",
       db_name="projeto",
    )
    
  • crawler.py:

    class SapoSpider(scrapy.Spider):
      name = "imoveis"
      allowed_domains = ["maisconsultores.pt"]
      start_urls = ["https://www.maisconsultores.pt/properties?page=%d&s=eedce" % i for i in range(23)]
    
    def parse(self,response):
       subpage_links = []
    
       for i in response.css('div.item.col-sm-4'):
           youritem = {
           'Titulo':i.css('div[class=image] h3::text').extract(),
           'Tipo_Negocio':i.css('div.price::text').re('[^\t\n\r\a]+'),
           'Preco':i.css('div.price span::text').extract(),
           }
    
        subpage_link = i.css('div[class=image] a::attr(href)').extract_first()
        full_url = response.urljoin(subpage_link)
        yield scrapy.Request(full_url, callback=self.parse_subpage, meta={'item':youritem})
    
    def parse_subpage(self,response):
        youritem = response.meta.get('item')
        youritem['Tipo_Imovel'] = response.xpath('//ul[@class="amenities"]//li[1]/text()').extract()
        yield youritem
    
有人能告诉我错误在哪里吗?我在里面呆了很长时间,但我找不到它。有什么想法吗?如果有人能帮助我,我将不胜感激

回溯:

2018-06-27 17:17:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.maisconsultores.pt/1651/apartamento-t2-em-linda-a-velha> (referer: https://www.maisconsultores.pt/properties?page=18&s=eedce)
2018-06-27 17:17:04 [scrapy.core.scraper] ERROR: Error processing {'Titulo': ['Apartamento T2 em Linda-a-Velha '], 'Tipo_Negocio': ['                                            Venda', '                                            ', '                                        '], 'Preco': ['240 000€', 'Novo Preço!'], 'Localizacao': [' Algés (Algés)'], 'Tipo_Imovel': [' Apartamento'], 'Condicao': [' Usado'], 'Numero_Divisoes': [' 3'], 'Numero_Quartos': [' 2'], 'Numero_Casas_Banho': [' 1'], 'Certificado_Energetico': ' Avaliação em Curso', 'Ano_Construcao': ' 1980', 'Area_Util': '                                                ', 'Area_Bruta': '                                                    ', 'Piso': ['                                                                                                            2º andar', '                                                                                                    ']}

Traceback (most recent call last):
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
    context)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 508, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
    res = self._query(query)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
    db.query(q)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 277, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1241, 'Operand should contain 1 column(s)')
2018-06-27 17:17:04[scrapy.core.engine]调试:爬网(200)(参考:https://www.maisconsultores.pt/properties?page=18&s=eedce)
2018-06-27 17:17:04[scrapy.core.scraper]错误:错误处理{'Titulo':['Apartmento T2 em Linda-a-Velha','Tipo_Negocio':['Venda','','','','Preco':['240 000欧元','Novo Preço!'],'Localizao':['Algés(Algés);“Tipo_Imovel”:[“Apartmento”],“Condico”:[“Usado”],“Numero_divisions”:[“3”],“Numero_Quartos”:[“2”],“Numero_Casas_Banho”:[“1”]“Certificado_Energetico”:“Avaliaço em Curso”,“Ano_Construcao”:“1980”,“Area_Util”:“Area_Bruta”:“Areaçu Bruta”:“Piso”:['2ºandar','']}
回溯(最近一次呼叫最后一次):
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1193行,在执行上下文中
(上下文)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\default.py”,第508行,在do\u execute中
cursor.execute(语句、参数)
文件“C:\Users\joanni\Anaconda3\lib\site packages\MySQLdb\cursors.py”,第250行,在execute中
errorhandler(self、exc、value)
文件“C:\Users\joanni\Anaconda3\lib\site packages\MySQLdb\connections.py”,第50行,在defaulterrorhandler中
提高错误值
文件“C:\Users\joanni\Anaconda3\lib\site packages\MySQLdb\cursors.py”,执行中的第247行
res=自我查询(查询)
文件“C:\Users\joanni\Anaconda3\lib\site packages\MySQLdb\cursors.py”,第411行,在查询中
rowcount=self.\u do\u查询(q)
文件“C:\Users\joanni\Anaconda3\lib\site packages\MySQLdb\cursors.py”,第374行,在查询中
数据库查询(q)
文件“C:\Users\joanni\Anaconda3\lib\site packages\MySQLdb\connections.py”,第277行,在查询中
_mysql.connection.query(self,query)
_mysql_exceptions.OperationalError:(1241,'操作数应包含1列'
上述异常是以下异常的直接原因:

Traceback (most recent call last):
  File "C:\Users\joani\Anaconda3\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Users\joani\Desktop\outra_tentativa\novo\novo\pipelines.py", line 111, in process_item
    session.commit()
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 943, in commit
    self.transaction.commit()
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 467, in commit
    self._prepare_impl()
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 447, in _prepare_impl
    self.session.flush()
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2254, in flush
    self._flush(objects)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2380, in _flush
    transaction.rollback(_capture_exception=True)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 187, in reraise
    raise value
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2344, in _flush
    flush_context.execute()
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 391, in execute
    rec.execute(self)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 556, in execute
    uow
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 181, in save_obj
    mapper, table, insert)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 866, in _emit_insert_statements
    execute(statement, params)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 948, in execute
    return meth(self, multiparams, params)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 269, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1060, in _execute_clauseelement
    compiled_sql, distilled_params
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1200, in _execute_context
    context)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1413, in _handle_dbapi_exception
    exc_info
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 186, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
    context)
  File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 508, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
    res = self._query(query)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
    db.query(q)
  File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 277, in query
    _mysql.connection.query(self, query)
sqlalchemy.exc.OperationalError: <unprintable OperationalError object>
回溯(最近一次呼叫最后一次):
文件“C:\Users\joanni\Anaconda3\lib\site packages\twisted\internet\defer.py”,第653行,在运行回调中
current.result=回调(current.result,*args,**kw)
文件“C:\Users\joanni\Desktop\outra\u tentiva\novo\novo\pipelines.py”,第111行,进程中项目
session.commit()
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第943行,提交
self.transaction.commit()
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第467行,提交
self.\u prepare\u impl()
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第447行,在\u prepare\u impl中
self.session.flush()
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第2254行,刷新
自冲洗(对象)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第2380行,在\u flush中
事务.rollback(\u capture\u exception=True)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\util\langhelpers.py”,第66行,在退出时__
兼容性(exc_类型、exc_值、exc_tb)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\util\compat.py”,第187行,在reraise中
增值
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第2344行,在\u flush中
flush_context.execute()
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\unitofwork.py”,第391行,在execute中
rec.execute(self)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\unitofwork.py”,第556行,在execute中
uow
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\persistence.py”,第181行,在save\u obj中
映射器、表、插入)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\orm\persistence.py”,第866行,在emit\uinsert\u语句中
执行(语句,参数)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第948行,在execute中
返回方法(自身、多线程、参数)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\sql\elements.py”,第269行,在连接上执行
返回连接。_execute_clauseelement(self、multiparams、params)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1060行,在执行元素中
编译的sql,提取的参数
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1200行,在执行上下文中
(上下文)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1413行,在_handle\u dbapi\u exception中
exc_信息
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\util\compat.py”,第203行,从原因中提升
重新释放(类型(异常),异常,tb=exc\U tb,原因=原因)
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\util\compat.py”,第186行,在reraise中
通过_回溯(tb)提升值
文件“C:\Users\joanni\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1193行,在_exe中