Python编程:PyThink数据库交互模块提高爬虫编写速度-阿里云开发者社区

开发者社区> 前端派大星> 正文

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

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

1.png

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

2.png

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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy
1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数据分析博文,记得关注哦~ 36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去。
9321 0
.NET数据库编程求索之路--9.使用EF实现
9.使用EF实现   源码下载: /Files/SummerRain/NetDbDevRoad/9使用EF实现1自动ORM简单三层.rar /Files/SummerRain/NetDbDevRoad/9使用EF实现2自动纯POCO代理简单三层.
651 0
Java数据库编程--JDBC
一、定义 JDBC,Java DataBase Connectivity。 是Java运行平台核心类库中的一部分,提供了访问数据库的API,由一些Java类和接口组成。 在Java中可以使用JDBC实现对数据库中表记录的查询,修改,和删除等操作 JDBC技术在数据库开发中占有很重要的地位。
870 0
JDBC数据库编程
JDBC数据库编程
100 0
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(2)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(2)     7.3 数据访问层工厂HomeShop.DALFactory      1 using System; 2 using System.
891 0
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4) 7.7 业务逻辑层HomeShop.BLL OrderBiz.cs View Code  1 using System; 2 using System.
776 0
749
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载