1

在此处输入图像描述

我正在使用scrapy和数据集(https://dataset.readthedocs.io/en/latest/quickstart.html#storing-data),它是 sqlalchemy 之上的一层,试图将数据加载到 sqllite 表中跟进Sqlalchemy:从 Scrapy 项目动态创建表

使用我拥有的数据集包:

class DynamicSQLlitePipeline(object):

    def __init__(self,table_name):

        db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
        db = dataset.connect(db_path)
        self.table = db[table_name].table


    def process_item(self, item, spider):

        try:
            print('TEST DATASET..')
            self.table.insert(dict(name='John Doe', age=46, country='China'))
            print('INSERTED')
        except IntegrityError:
                print('THIS IS A DUP')
        return item

运行我的蜘蛛后,我看到在 try except 块中打印出打印语句,没有错误,但完成后,我查看表格并查看屏幕截图。表中没有数据。我究竟做错了什么?

4

2 回答 2

2

您发布的代码对我来说不起作用:

TypeError: __init__() takes exactly 2 arguments (1 given)

那是因为该__init__方法需要一个table_name没有被传递的参数。您需要from_crawler在管道对象中实现类方法,例如:

@classmethod
def from_crawler(cls, crawler):
    return cls(table_name=crawler.spider.name)

这将使用蜘蛛名称作为表名创建一个管道对象,您当然可以使用任何您想要的名称。

此外,该行self.table = db[table_name].table应替换为self.table = db[table_name]https://dataset.readthedocs.io/en/latest/quickstart.html#storing-data

之后,数据被存储: 在此处输入图像描述

于 2016-12-22T14:46:39.480 回答
1

数据库连接可能存在一些问题。除了检查问题外,请尝试使用此代码段。

try:
   db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
   db = dataset.connect(db_path)
   self.table = db[table_name].table
except Exception:
   traceback.exec_print()
于 2016-12-21T23:00:29.573 回答