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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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 所提供的数据操作流程


Spider 爬虫编写抓取规则

返回Item

Pipline 处理数据


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


Spider 爬虫编写抓取规则

Model 处理数据


Spider 爬虫编写抓取规则

Model 处理数据

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


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


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



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
60 6
|
6天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
19 5
|
14天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
17天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
39 4
|
16天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
19天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
20天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
18天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
15 0
|
19天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
15 0
|
19天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
16 0