python:sqlalchemy.exc.operationalerror:< unprintable operationalerror object>

mccptt67  于 2021-06-24  发布在  Mysql
关注(0)|答案(0)|浏览(471)

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

  1. class ScrapySpiderPipeline(object):
  2. def __init__(self):
  3. engine = db_connect()
  4. create_table(engine)
  5. self.Session = sessionmaker(bind=engine)
  6. def process_item(self, item, spider):
  7. session = self.Session()
  8. quotedb = QuoteDB()
  9. quotedb.Titulo = item["Titulo"]
  10. quotedb.Tipo_Negocio = item["Tipo_Negocio"]
  11. quotedb.Preco = item["Preco"]
  12. quotedb.Tipo_Imovel = item["Tipo_Imovel"]
  13. try:
  14. session.add(quotedb)
  15. session.commit()
  16. except:
  17. session.rollback()
  18. raise
  19. finally:
  20. session.close()
  21. return item

型号.py:

  1. from scrapy.utils.project import get_project_settings
  2. DeclarativeBase = declarative_base()
  3. def db_connect():
  4. return create_engine(get_project_settings().get("CONNECTION_STRING"))
  5. def create_table(engine):
  6. DeclarativeBase.metadata.create_all(engine)
  7. class QuoteDB(DeclarativeBase):
  8. __tablename__ = "imovel_table"
  9. id = Column(Integer, primary_key=True)
  10. Titulo = Column('Titulo', VARCHAR(200))
  11. Tipo_Negocio = Column('Tipo_Negocio', String(100))
  12. Preco = Column('Preco', Text())
  13. Tipo_Imovel = Column('Tipo_Imovel', Text())
  14. print(QuoteDB.__table__)

项目.py:

  1. class QuoteItem(scrapy.Item):
  2. Titulo = scrapy.Field()
  3. Tipo_Negocio = scrapy.Field()
  4. Preco = scrapy.Field()
  5. Tipo_Imovel = scrapy.Field()

设置.py:

  1. ITEM_PIPELINES = {
  2. 'novo.pipelines.ScrapySpiderPipeline' : 300,
  3. }
  4. CONNECTION_STRING = "{drivername}://{user}:{passwd}@{host}:{port}/{db_name}?charset=utf8".format(
  5. drivername="mysql",
  6. user="root",
  7. passwd="",
  8. host="localhost",
  9. port="3306",
  10. db_name="projeto",
  11. )

爬虫.py:

  1. class SapoSpider(scrapy.Spider):
  2. name = "imoveis"
  3. allowed_domains = ["maisconsultores.pt"]
  4. start_urls = ["https://www.maisconsultores.pt/properties?page=%d&s=eedce" % i for i in range(23)]
  5. def parse(self,response):
  6. subpage_links = []
  7. for i in response.css('div.item.col-sm-4'):
  8. youritem = {
  9. 'Titulo':i.css('div[class=image] h3::text').extract(),
  10. 'Tipo_Negocio':i.css('div.price::text').re('[^\t\n\r\a]+'),
  11. 'Preco':i.css('div.price span::text').extract(),
  12. }
  13. subpage_link = i.css('div[class=image] a::attr(href)').extract_first()
  14. full_url = response.urljoin(subpage_link)
  15. yield scrapy.Request(full_url, callback=self.parse_subpage, meta={'item':youritem})
  16. def parse_subpage(self,response):
  17. youritem = response.meta.get('item')
  18. youritem['Tipo_Imovel'] = response.xpath('//ul[@class="amenities"]//li[1]/text()').extract()
  19. yield youritem

有人能告诉我错误在哪里吗?我在里面呆了很长时间,却找不到它。你知道吗?如果有人能帮我,我会很感激的!
回溯:

  1. 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)
  2. 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', ' ']}
  3. Traceback (most recent call last):
  4. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
  5. context)
  6. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 508, in do_execute
  7. cursor.execute(statement, parameters)
  8. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
  9. self.errorhandler(self, exc, value)
  10. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
  11. raise errorvalue
  12. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
  13. res = self._query(query)
  14. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
  15. rowcount = self._do_query(q)
  16. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
  17. db.query(q)
  18. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 277, in query
  19. _mysql.connection.query(self, query)
  20. _mysql_exceptions.OperationalError: (1241, 'Operand should contain 1 column(s)')

上述异常是以下异常的直接原因:

  1. Traceback (most recent call last):
  2. File "C:\Users\joani\Anaconda3\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
  3. current.result = callback(current.result, *args,**kw)
  4. File "C:\Users\joani\Desktop\outra_tentativa\novo\novo\pipelines.py", line 111, in process_item
  5. session.commit()
  6. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 943, in commit
  7. self.transaction.commit()
  8. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 467, in commit
  9. self._prepare_impl()
  10. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 447, in _prepare_impl
  11. self.session.flush()
  12. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2254, in flush
  13. self._flush(objects)
  14. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2380, in _flush
  15. transaction.rollback(_capture_exception=True)
  16. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 66, in __exit__
  17. compat.reraise(exc_type, exc_value, exc_tb)
  18. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 187, in reraise
  19. raise value
  20. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2344, in _flush
  21. flush_context.execute()
  22. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 391, in execute
  23. rec.execute(self)
  24. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 556, in execute
  25. uow
  26. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 181, in save_obj
  27. mapper, table, insert)
  28. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 866, in _emit_insert_statements
  29. execute(statement, params)
  30. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 948, in execute
  31. return meth(self, multiparams, params)
  32. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 269, in _execute_on_connection
  33. return connection._execute_clauseelement(self, multiparams, params)
  34. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1060, in _execute_clauseelement
  35. compiled_sql, distilled_params
  36. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1200, in _execute_context
  37. context)
  38. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1413, in _handle_dbapi_exception
  39. exc_info
  40. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 203, in raise_from_cause
  41. reraise(type(exception), exception, tb=exc_tb, cause=cause)
  42. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 186, in reraise
  43. raise value.with_traceback(tb)
  44. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
  45. context)
  46. File "C:\Users\joani\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 508, in do_execute
  47. cursor.execute(statement, parameters)
  48. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
  49. self.errorhandler(self, exc, value)
  50. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
  51. raise errorvalue
  52. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
  53. res = self._query(query)
  54. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
  55. rowcount = self._do_query(q)
  56. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
  57. db.query(q)
  58. File "C:\Users\joani\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 277, in query
  59. _mysql.connection.query(self, query)
  60. sqlalchemy.exc.OperationalError: <unprintable OperationalError object>

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题