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中使用