我正在使用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()
如何将每个已删除项目的已删除数据保存在一个单独的行中?
答案 0 :(得分:0)
由我来看这个answer。问题是你的蜘蛛正在提取所有项目并将其存储在一个列表中,然后将它放到项目管道中。因此,项目管道不是一次获取一个信息。对此的解决方案是使用循环并逐个迭代所有所需的行。