Python编程:PyThink数据库交互模块提高爬虫编写速度

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 所提供的数据操作流程

Python编程:PyThink数据库交互模块提高爬虫编写速度

思路很清晰,不过有个更快的方式

Python编程:PyThink数据库交互模块提高爬虫编写速度

如果字段过多,而且一次性抓取,实在没必要去定义那么多类,而且项目文件数量会以惊人的速度增加

下面采用后者写一个简单的实例

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 个文件:


  1. spider
  2. item
  3. pipline

现在,我们一共定义了2个文件

  1. spider
  2. model

文件减少,意味着项目文件会减少,代码量减少,何乐不为?

第二、性能

原有方式,使用yield 返回Item对象,速度上是要快一些


不过你必须在项目中使用全局搜索,才能搜索到哪个地方在处理这个Item ,在IDE中不能直接跳转,很不方便


使用后者,能够轻松的知道是哪个地方在处理这个数据,使得项目易于维护


使用ThinkModel 还可以在其中进行自定义扩展,增加其他操作,那是后话了


最后

总之,使用item-pipline 方式编写复杂,性能好;使用model 方式编写容易,会降低性能。

当然,一个折中的方式是将model写入操作移到pipline中使用

上一篇:Linux:rsync文件同步


下一篇:Python编程:abc模块实现抽象类