Scrapy在SQLite中将所有结果导出到一行

时间:2015-12-30 23:17:41

标签: sqlite scrapy

我正在使用Scrapy制作基本蜘蛛,并希望使用SQLite存储数据。蜘蛛工作正常并保存我想要的数据,但它将所有数据写入数据库中的同一行。

这是我的蜘蛛:

    def parse(self, response):

    for sel in response.xpath('//*[@class="class"]'):
        item = ScrapedItem()
        item['Name'] = sel.xpath('*/header/div//h2/a/text()').extract()
        item['Site'] = sel.xpath('*/header/div/a[1]/text()').extract()
        item['Category'] = sel.xpath('*/header/div/h6[3]/text()').extract()

        yield item

这是我的管道:

import sqlite3 as lite
from xyz import settings
from xyz import items
con = None

class Pipeline(object):

    def __init__(self):
        self.setupDBCon()
        self.createTables()

    def process_item(self, item, spider):
        self.storeInfoInDb(item)
        return item

def storeInfoInDb(self, item):
        self.cur.execute("INSERT INTO Table(\
            Name, \
            Site, \
            Category\
            ) \
        VALUES( ?, ?, ?, ? )", \
        ( \
            str(item.get('Name', '')),
            str(item.get('Site', '')),
            str(item.get('Category', ''))
        ))
        print item.get('Name', '')
        self.con.commit()

def setupDBCon(self):
    self.con = lite.connect('test.db')
    self.cur = self.con.cursor()

def __del__(self):
    self.closeDB()

def createTables(self):
    self.dropAgencyTable()
    self.createAgencyTable()

def createTable(self):
    self.cur.execute("CREATE TABLE IF NOT EXISTS Table(id INTEGER PRIMARY KEY NOT NULL, \
        Name TEXT, \
        Site TEXT, \
        Category TEXT )")

def dropTable(self):
    self.cur.execute("DROP TABLE IF EXISTS Agency")

def closeDB(self):
    self.con.close()

如何将每个已删除项目的已删除数据保存在一个单独的行中?

1 个答案:

答案 0 :(得分:0)

由我来看这个answer。问题是你的蜘蛛正在提取所有项目并将其存储在一个列表中,然后将它放到项目管道中。因此,项目管道不是一次获取一个信息。对此的解决方案是使用循环并逐个迭代所有所需的行。