十三. 數(shù)據(jù)庫:SQLite篇

SQLite:文件型輕量級數(shù)據(jù)庫东跪,處理速度快
MySQL:關(guān)系型數(shù)據(jù)庫,開源免費鸣哀,支持大型數(shù)據(jù)庫架忌,個人以及中小企業(yè)首選。
MongoDB:面向文檔的非關(guān)系型數(shù)據(jù)庫我衬,功能強大叹放、靈活、易于拓展挠羔。
Redis:使用ANSI C編寫的高性能Key-Value數(shù)據(jù)庫井仰,使用內(nèi)存作為主存儲,內(nèi)存中的數(shù)據(jù)可以被持久化到硬盤中破加。

首先介紹SQLite:
  • 1.安裝:http://www.sqlite.org/download.html
    ①下載兩個zip文件:


    ②將它們一起解壓到D:\sqlite文件夾俱恶,配置環(huán)境變量PATH后追加“D:\sqlite;”。

  • 2.運行:
    打開cmd拌喉,運行:sqlite3即可打開數(shù)據(jù)庫速那。

命令 含義
.help 顯示SQLite的使用命令
.exit 退出 SQLite數(shù)據(jù)庫
  • 3.建立數(shù)據(jù)庫:在需要建立數(shù)據(jù)庫的地方輸入sqlite3 scrapy.db,使用.databases生成文件尿背。

-4. 在命令行中創(chuàng)建數(shù)據(jù)表

 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
 );
  • 5.推薦使用SQLiteStudio作為SQLite管理工具端仰,無需安裝,解壓點擊目錄中的SQLiteStudio.exe即可使用.
    下載地址:http://www.cr173.com/soft/94247.html

使用SQLiteStudio添加數(shù)據(jù)庫scrapy.db田藐,點擊“測試連接”荔烧,選擇“OK”。


在管理工具中可以清晰看到各數(shù)據(jù)的類型汽久,主鍵等鹤竭,也可以在管理工具中新建列表或者修改數(shù)據(jù),更加直觀景醇。


  • 6.在python中使用sqlite3寫入數(shù)據(jù)臀稚,運行后打開SQLiteStudio即可看到結(jié)果。
# -*- coding: utf-8 -*-
import sqlite3

#連接數(shù)據(jù)庫三痰,得到Connection對象
conn = sqlite3.connect('example.db')
#print(type(conn))

#創(chuàng)建Cursor對象吧寺,用于執(zhí)行SQL語句
cur = conn.cursor()
#print(type(cur))

#創(chuàng)建數(shù)據(jù)表
cur.execute("CREATE TABLE person(name VARCHAR(32),age INT,sex char(1))")

#插入一條數(shù)據(jù)
cur.execute('INSERT INTO person VALUES(?,?,?)',('李小龍',23,'M'))

#保存變更,commit后數(shù)據(jù)才會實際寫入數(shù)據(jù)庫
conn.commit()

#關(guān)閉連接
conn.close()

結(jié)果如下:


  • 7.使用scrapy獲取數(shù)據(jù)散劫,并存放到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

# 爬取到的數(shù)據(jù)寫入到SQLite數(shù)據(jù)庫
import sqlite3

class SQLitePipeline(object):

    # 打開數(shù)據(jù)庫
    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()
        
    # 關(guān)閉數(shù)據(jù)庫
    def close_spider(self,spider):
        self.db_conn.commit()
        self.db_conn.close()
        
    # 對數(shù)據(jù)進行處理
    def process_item(self,item,spider):
        self.insert_db(item)
        
        return item

    # 插入數(shù)據(jù)
    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的數(shù)據(jù)
        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()      #評價數(shù)量
    upc = scrapy.Field()             #產(chǎn)品編碼
    stock = scrapy.Field()           #庫存量

⑤運行cmd命令:scrapy crawl books

⑥結(jié)果共1000條數(shù)據(jù):


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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获搏,一起剝皮案震驚了整個濱河市赖条,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖纬乍,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碱茁,死亡現(xiàn)場離奇詭異,居然都是意外死亡仿贬,警方通過查閱死者的電腦和手機早芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诅蝶,“玉大人,你說我怎么就攤上這事募壕〉骶妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵舱馅,是天一觀的道長缰泡。 經(jīng)常有香客問我,道長代嗤,這世上最難降的妖魔是什么棘钞? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮干毅,結(jié)果婚禮上宜猜,老公的妹妹穿的比我還像新娘。我一直安慰自己硝逢,他們只是感情好姨拥,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渠鸽,像睡著了一般叫乌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徽缚,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天憨奸,我揣著相機與錄音,去河邊找鬼凿试。 笑死排宰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的红省。 我是一名探鬼主播额各,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吧恃!你這毒婦竟也來了虾啦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傲醉,沒想到半個月后蝇闭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡硬毕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年呻引,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吐咳。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡逻悠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出韭脊,到底是詐尸還是另有隱情童谒,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布沪羔,位于F島的核電站饥伊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔫饰。R本人自食惡果不足惜琅豆,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篓吁。 院中可真熱鬧茫因,春花似錦、人聲如沸越除。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摘盆。三九已至翼雀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孩擂,已是汗流浹背狼渊。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留类垦,地道東北人狈邑。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚤认,于是被迫代替她去往敵國和親米苹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容