前兩天老大布置一個任務,說爬下來的數據要存入數據庫中,丟給我一個peewee,說用這個。當時的我兩眼一抹黑,這是個什么東西呀,我知道scrapy的數據存入數據庫是在pipelines中進行設置但是peewee是什么東西呢。經過兩天不懈的努力,終于呀成功了
peewee
peewee 是一款數據庫 ORM 庫,可以很方便的幫你把對象和數據庫表進行映射,從而讓你不用寫一句 SQL 就能操作數據庫,我們爬到的數據需要寫到 mysql 數據庫中。
這句話就是說當我們數據庫設置好字段時,可以通過這個庫直接生成一個包含數據庫表的所有字段和字段的各種設置
數據庫表字段
peewee可以用一條命令生成關于該數據庫表的字段設置
從現有數據庫生成相應的模塊,使用pwiz實現
python -m pwiz -e mysql -H localhost -u root -P root user > md.py
python3 -m pwiz -e mysql(數據庫) -H 服務器名 -p 端口號 -u 用戶名 -P 密碼 數據庫名稱 > 生成文件名
生成文件
from peewee import *
database = MySQLDatabase('user', **{'host': 'localhost', 'password': 'root', 'user': 'root'})
class UnknownField(object):
def __init__(self, *_, **__): pass
class BaseModel(Model):
class Meta:
database = database
class Art(BaseModel):
inc = TextField()
top = TextField()
m5d = CharField(index=True, null=True)
wfrm = TextField(null=True)
html = CharField()
class Meta:
db_table = 'db'
indexes = (
((''inc'), False),
(('wfrm'), False),
)
model與fields
對應關系:
在peewee中,一個繼承model類的類定義為某個數據庫的一個表格,如上面我們的art表就是繼承baseModel類。類中的field為數據庫中的列(字段)
OK,生成db.py后放在scrapy中與pilelines同一級目錄下
pipelines
在pileline中引入該文件(不要忘了db文件前還有一個".")
from .db import Art
pipelines中我定義了兩個類,一個類用于把數據輸出為json格式,一個類用于把數據保存到數據庫中
import codecs
import json
class WccPlaPipeline(object):
def __init__(self):
self.file = codecs.open("保存的文件名.json","wb",encoding="utf-8")
#這個方法必須返回一個Item對象,參數item:被爬取的item
#spider爬取該item的spider
def process_item(self, item, spider):
#打開JSON文件,向里面以dumps的方式吸入數據,
#其中ensure_ascii=False,不然數據會直接為utf編碼的方式存入
line = json.dumps(dict(item),ensure_ascii=False)+'\n'
self.file.write(line)
return item
class MysqlPipeline(object):
def process_item(self,item,spider):
if Art.table_exists() == False:
Art.create_table()
data = Art(title=item['title'],text=item['text'])
data.save()
return item
json文件和自編寫的spider在同一級目錄下,這里我只用了peewee的插入語句,對其他語句感興趣的小伙伴可以自行百度哦
settings的設置
由于pipelines中定義了兩個類,所以要在settings中給這兩個類設置一個執行的優先級順序
ITEM_PIPELINES = {
'項目名.pipelines.MysqlPipeline': 300,
'項目名.pipelines.Pipeline': 100,
}
這樣就可以執行scrapy啦