返回介绍

12.1 SQLite

发布于 2024-02-05 21:13:20 字数 3011 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文