十三. 数据库:SQLite篇

SQLite:文件型轻量级数据库,处理速度快
MySQL:关系型数据库,开源免费,支持大型数据库,个人以及中小企业首选。
MongoDB:面向文档的非关系型数据库,功能强大、灵活、易于拓展。
Redis:使用ANSI C编写的高性能Key-Value数据库,使用内存作为主存储,内存中的数据可以被持久化到硬盘中。

首先介绍SQLite:
  • 1.安装:http://www.sqlite.org/download.html
    ①下载两个zip文件:


    ②将它们一起解压到D:\sqlite文件夹,配置环境变量PATH后追加“D:\sqlite;”。

  • 2.运行:
    打开cmd,运行:sqlite3即可打开数据库。

命令 含义
.help 显示SQLite的使用命令
.exit 退出 SQLite数据库
  • 3.建立数据库:在需要建立数据库的地方输入sqlite3 scrapy.db,使用.databases生成文件

-4. 在命令行中创建数据表

 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
 );

使用SQLiteStudio添加数据库scrapy.db,点击“测试连接”,选择“OK”。


在管理工具中可以清晰看到各数据的类型,主键等,也可以在管理工具中新建列表或者修改数据,更加直观。


  • 6.在python中使用sqlite3写入数据,运行后打开SQLiteStudio即可看到结果。
# -*- coding: utf-8 -*-
import sqlite3

#连接数据库,得到Connection对象
conn = sqlite3.connect('example.db')
#print(type(conn))

#创建Cursor对象,用于执行SQL语句
cur = conn.cursor()
#print(type(cur))

#创建数据表
cur.execute("CREATE TABLE person(name VARCHAR(32),age INT,sex char(1))")

#插入一条数据
cur.execute('INSERT INTO person VALUES(?,?,?)',('李小龙',23,'M'))

#保存变更,commit后数据才会实际写入数据库
conn.commit()

#关闭连接
conn.close()

结果如下:


  • 7.使用scrapy获取数据,并存放到SQLite当中:
    ①spider文件如下,不再进行分析:
# -*- coding: utf-8 -*-
import scrapy
from books.items import BooksItem
from scrapy.linkextractors import LinkExtractor

class BooksspiderSpider(scrapy.Spider):
    name = 'booksspider'
    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com/']

    def parse(self, response):
        ##提取每本书的链接
        le = LinkExtractor(restrict_xpaths='//article[@class="product_pod"]')  ##具体位置在//article/div/a的标签中
        detail_urls = le.extract_links(response)
        for detail_url in detail_urls:
            yield scrapy.Request(detail_url.url,callback=self.parse_book)  ##记得使用.url提取出extract_links里面的链接。

        ##提取下一页的链接
        le2 = LinkExtractor(restrict_xpaths='//li[@class="next"]')
        next_url = le2.extract_links(response)[0].url
        yield scrapy.Request(next_url,callback=self.parse)


    def parse_book(self,response):
        ##提取每本书的具体信息
        item = BooksItem()
        info = response.xpath('//div[contains(@class,"product_main")]')
        item['name'] = info.xpath('h1/text()').extract()[0]
        item['price'] = info.xpath('p/text()').extract()[0]
        item['review_rating'] = info.xpath('p[3]/@class').re('star-rating (\w+)')[0]

        info2 = response.xpath('//table[contains(@class,"table")]')
        item['upc'] = info2.xpath('//tr[1]/td/text()').extract_first()
        item['stock'] = info2.xpath('//tr[6]/td/text()').re_first('\d+')
        item['review_num'] = info2.xpath('//tr[7]/td/text()').extract_first()
        yield item

②pipelines.py

# 爬取到的数据写入到SQLite数据库
import sqlite3

class SQLitePipeline(object):

    # 打开数据库
    def open_spider(self,spider):
        db_name = spider.settings.get('SQLITE_DB_NAME','scrapy.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)

##处理review_rating的pipeline
class BooksPipeline(object):

    review_rating_map = {
        'One':1,
        'Two':2,
        'Three':3,
        'Four':4,
        'Five':5
    }


    def process_item(self, item, spider):
        # rating = item.get('review_rating')  #获取review_rating的数据
        rating = item['review_rating']  #与上面的语句等价
        item['review_rating'] = self.review_rating_map[rating]

        return item

③settings.py: 启用SQLitePipeline

SQLITE_DB_NAME = 'scrapy.db'

ITEM_PIPELINES = {
   'books.pipelines.BooksPipeline': 300,    #原有的pipeline
    'books.pipelines.SQLitePipeline': 400,  #SQL的pipeline
}

④items.py

import scrapy

class BooksItem(scrapy.Item):
    name = scrapy.Field()            #书名
    price = scrapy.Field()           #价格
    review_rating = scrapy.Field()   #评价等级(1-5星)
    review_num = scrapy.Field()      #评价数量
    upc = scrapy.Field()             #产品编码
    stock = scrapy.Field()           #库存量

⑤运行cmd命令:scrapy crawl books

⑥结果共1000条数据:


也可以用cmd命令显示:
sqlite3 scrapy.db
select count(*) from books;
select * from books;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容