12.1 SQLite
SQLite是一个文件型轻量级数据库,它的处理速度很快,在数据量不是很大的情况下,使用SQLite足够了。
首先,创建一个供Scrapy使用的SQLite数据库,取名为scrapy.db:
$ sqlite3 scrapy.db ... sqlite>
接下来,在客户端中创建数据表(Table):
CREATE TABLE books ( upc CHAR(16) NOT NULL PRIMARY KEY, name VARCHAR(256) NOT NULL, price VARCHAR(16) NOT NULL, review_rating INT, review_num INT, stock INT );
在Python中访问SQLite数据库可使用Python标准库中的sqlite3模块。下面是使用sqlite3模块将数据写入SQLite数据库的简单示例:
import sqlite3 #连接数据库,得到Connection 对象 conn = sqlite3.connect('example.db') #创建Curosr 对象,用来执行SQL语句 cur = conn.cursor() #创建数据表 cur.execute('CREATE TABLE person (name VARCHAR(32), age INT, sex char(1))') #插入一条数据 cur.execute('INSERT INTO person VALUES (?,?,?)', ('刘硕', 34, 'M')) #保存变更, commit 后数据才被实际写入数据库 conn.commit() #关闭连接 conn.close()
了解了在Python中如何操作SQLite数据库后,接下来编写一个能将爬取到的数据写入SQLite数据库的Item Pipeline。在pipelines.py中实现SQLitePipeline的代码如下:
import sqlite3 class SQLitePipeline(object): def open_spider(self, spider): db_name = spider.settings.get('SQLITE_DB_NAME', 'scrapy_defaut.db') self.db_conn = sqlite3.connect(db_name) self.db_cur = self.db_conn.cursor() def close_spider(self, spider): self.db_conn.commit() self.db_conn.close() def process_item(self, item, spider): self.insert_db(item) return item def insert_db(self, item): values = ( item['upc'], item['name'], item['price'], item['review_rating'], item['review_num'], item['stock'], ) sql = 'INSERT INTO books VALUES (?,?,?,?,?,?)' self.db_cur.execute(sql, values) # 每插入一条就commit一次会影响效率 # self.db_conn.commit()
解释上述代码如下:
open_spider方法在开始爬取数据之前被调用,在该方法中通过spider.settings对象读取用户在配置文件中指定的数据库,然后建立与数据库的连接,将得到的Connection对象和Cursor对象分别赋值给self.db_conn和self.db_cur,以便之后使用。
process_item方法处理爬取到的每一项数据,在该方法中调用insert_db方法,执行插入数据操作的SQL语句。但需要注意的是,在insert_db中并没有调用连接对象的commit方法,也就意味着此时数据并没有实际写入数据库。如果每插入一条数据都调用一次commit方法,会严重降低程序执行效率,并且我们对数据插入数据库的实时性并没有什么要求,因此可以在爬取完全部数据后再调用commit方法。
close_spider方法在爬取完全部数据后被调用,在该方法中,调用连接对象的commit方法将之前所有的插入数据操作一次性提交给数据库,然后关闭连接对象。
在配置文件settings.py中指定我们所要使用的SQLite数据库,并启用SQLitePipeline:
SQLITE_DB_NAME = 'scrapy.db' ITEM_PIPELINES = { 'toscrape_book.pipelines.SQLitePipeline': 400, }
运行爬虫,并查看数据库:
$ scrapy crawl books ... $ sqlite3 scrapy.db SQLite version 3.8.2 2013-12-06 14:53:30 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select count(*) from books; 1000 sqlite> select * from books; a22124811bfa8350|It's Only the Himalayas|£45.17|2|0|19 feb7cc7701ecf901|Olio|£23.88|1|0|19 a34ba96d4081e6a4|Rip it Up and Start Again|£35.02|5|0|19 a18a4f574854aced|Libertarianism for Beginners|£51.33|2|0|19 ce6396b0f23f6ecc|Set Me Free|£17.46|5|0|19 fa9610a50a1bf149|Masks and Shadows|£56.40|2|0|16 3c346ab1e76ae1f6|Obsidian (Lux #1)|£14.86|2|0|16 09b6cc87e62c2c58|Danganronpa Volume 1|£51.99|4|0|16 ...
结果表明,我们成功地将1000条数据存储到了SQLite数据库。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论