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;