PyThink模块 提供了一些快捷方式,用于数据库的基本增、删、改、查
可以让你 如丝般顺滑地向MySQL插入数据
github: https://github.com/mouday/PyThink
安装
pip install pythink
一、使用方式
1、定义数据Model
# -*- coding: utf-8 -*-
from pythink import ThinkModel, ThinkDatabase
# 1、定义数据Model, 定义方式类似peewee
db_url = "mysql://root:123456@127.0.01:3306/demo"
db = ThinkDatabase(db_url)
# demo库的基类,以便复用
class DemoThinkModel(ThinkModel):
database = db
# 方便之处在于不用定义字段
class StudentThinkModel(DemoThinkModel):
"""
学生表
"""
2、插入数据
# -- coding: utf-8 --
# 插入数据
data = {
"name": "Tom",
"age": 23
}
StudentThinkModel.insert(data)
# 插入多条数据
lst = [
{
"name": "Tom",
"age": 23
},
{
"name": "Jack",
"age": 24
}
]
StudentThinkModel.insert(lst)
二、配合Scrapy框架使用
首先回忆一下Scrapy 所提供的数据操作流程
思路很清晰,不过有个更快的方式
如果字段过多,而且一次性抓取,实在没必要去定义那么多类,而且项目文件数量会以惊人的速度增加
下面采用后者写一个简单的实例
1、定义model demo_models.py
# -- coding: utf-8 --
# @Date : 2019-05-15
# @Author : Peng Shiyu
from pythink import ThinkModel, ThinkDatabase
db_url = "mysql://root:123456@127.0.01:3306/demo"
db = ThinkDatabase(db_url, echo=True)
class DemoThinkModel(ThinkModel):
database = db
class TitleThinkModel(DemoThinkModel):
"""
定义title 表
create table title(
id int(11) primary key auto_increment,
title varchar(50),
url varchar(100)
) comment '存放爬虫数据'
"""
2、编写爬虫 baidu_spider.py
# -- coding: utf-8 --
from scrapy import Spider
from demo_models import TitleThinkModel
# 定义百度spider
class BaiduSpider(Spider):
name = "baidu_spider"
start_urls = [
"https://www.baidu.com/";
]
def parse(self, response):
title = response.css("title::text").extract_first("")
item = {
"title": title,
"url": response.url
}
TitleThinkModel.insert(item)
3、运行爬虫
$ scrapy runspider baidu_spider.py
4、 查看数据库的数据,数据已经成功入库
mysql> select * from title;
+----+-----------------------------+------------------------+
| id | title | url |
+----+-----------------------------+------------------------+
| 1 | 百度一下,你就知道 | https://www.baidu.com/ |
+----+-----------------------------+------------------------+
1 row in set (0.00 sec)
三、总结
第一、项目结构
回头看下,按照原来的方式,我们应该至少会定义 3 个文件:
- spider
- item
- pipline
现在,我们一共定义了2个文件
- spider
- model
文件减少,意味着项目文件会减少,代码量减少,何乐不为?
第二、性能
原有方式,使用yield 返回Item对象,速度上是要快一些
不过你必须在项目中使用全局搜索,才能搜索到哪个地方在处理这个Item ,在IDE中不能直接跳转,很不方便
使用后者,能够轻松的知道是哪个地方在处理这个数据,使得项目易于维护
使用ThinkModel 还可以在其中进行自定义扩展,增加其他操作,那是后话了
最后
总之,使用item-pipline 方式编写复杂,性能好;使用model 方式编写容易,会降低性能。
当然,一个折中的方式是将model写入操作移到pipline中使用
</div>