Scrapy存入MySQL(四):scrapy item pipeline组件实现细节

时间:2018-01-31 10:05:58作者:scrapy中文网阅读:

Scrapy存入MySQL或是其他数据库,虽然scrapy没有给我们提供拿来就用的类,但是她已经给我们实现了部分方法,我们继承它给我们实现的方法就能轻松的把数据存入你想存入的数据库,那我们要肿么继承呢?其实就是编写一个pipeline组件,我们需要实现一个pipeline,实现了之后,我们蜘蛛爬取的数据(也就是item定义的内容),通过yield便提交给了pipeline,然后在pipeline里面就可以实现数据的:去重、存储。名义上这里是说scrapy数据存储到mysql,但其实关键是介绍pipeline的编写方式,也就是学习我们要怎么在设置里设置pipeline、怎样在pipeline里面继承scrapy给我们提供的关于pipeline的方法、怎样创建对数据库的连接,好了,接下来我们一一来看!

一、继承pipeline必要方法:

如果我们要编写一个pipeline组件,如:MySQLPipline(命名随意,根据这个类的具体功能来即可),我们必须实现这个方法:

process_item(self, item, spider)

这个方法有两个参数,一个是item,一个是spider。spider就是爬取数据的蜘蛛,item就是爬取到的数据,执行完数据库插入之后,需要执行返回,也就是需要:return item。以上方法是必须要实现的方法,无论你是插入mysql、mongodb还是其他数据库,都必须实现这么一个方法;另外除了这么一个方法,scrapy还提供了另外两个:

open_spider(self, spider)
 
close_spider(self, spider)

可以看到,上面两个方法一个是蜘蛛打开的时候执行的,一个是关闭的时候执行的,上面的方法根据自己的需要,按需实现,并非必须方法!
  
二、MySQLPipline类具体实现 细节:

其实说白了这个类就是python操作mysql的类,因此必须引入python操作mysql驱动。引入之前需要确保mysql驱动正确安装,因为python3.4以下和python3.5以上驱动安装方式各有千秋,经常会遇到坑,如果你不能正确安装请查看:《Python Mysql驱动安装及填坑教程》,这里我们为python3.6因此引入方式为:
import pymysql.cursors
如果你是python3.4以下,你可能是需要这样引入:
import MySQLdb
引入之后,就可以编写具体的类了,首先我们需要创建数据库的连接,创建数据库连接之前,需要确保你已经成功安装了MySQL并且已经在MySQL里面创建好了表、字段,并且MySQL已经启动,很多小伙伴问我们,为神马一模一样的代码,就是执行错误呢?我们排查了许久也才发现,连数据库都木有,这叫我们情何以堪!
scrapy存入mysql
如果你还不知道如何快速安装数据库,可以查看:《Mysql快速无坑安装》,如果你已经装好,不知道如何可视化管理(创建、删除:表、字段)MySQL,可参看:《Navicat使用详解》。完成以上步骤,我们来创建数据库连接:
 def __init__(self):
        # 连接数据库
        self.connect = pymysql.connect(
            host='127.0.0.1',#数据库地址
            port=3306,# 数据库端口
            db='scrapyMysql', # 数据库名
            user = 'root', # 数据库用户名
            passwd='root', # 数据库密码
            charset='utf8', # 编码方式
            use_unicode=True)

        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor();
经过上面步骤,只要类一初始化,那我们就已经练好了数据库!那接下来我们就需要实现scrapy给我们提供的方法:process_item(self, item, spider)进行数据的存储,看一下具体实现:
 def process_item(self, item, spider):

        self.cursor.execute(
            """insert into chuanke(name, type, view, price ,teacher, url)
            value (%s, %s, %s, %s, %s, %s)""",#纯属python操作mysql知识,不熟悉请恶补
            (item['name'],# item里面定义的字段和表字段对应
             item['type'],
             item['view'],
             item['price'],
             item['teacher'],
             item['url']))

        # 提交sql语句
        self.connect.commit()

        return item#必须实现返回
经过这么一个步骤,数据就实现了MySQL的入库,当然如果你要查重也可以在上面方法实现,后面我们慢慢介绍!

三、settings.py启用MySQLPipline

经过上面步骤,你会发现,运行蜘蛛之后还是无法存入数据库,这里需要我们在settings.py里面开启MySQLPipline,如下:
ITEM_PIPELINES = {
    'scrapyMysql.MySQLPipeline.MySQLPipeline': 1,
     #格式为:'项目名.文件名.类名':优先级(越小越大)
}
四、MySQLPipline.py具体实现
import pymysql.cursors
import logging


class MySQLPipeline(object):
    def __init__(self):
        # 连接数据库
        self.connect = pymysql.connect(
            host='127.0.0.1',  # 数据库地址
            port=3306,  # 数据库端口
            db='scrapyMysql',  # 数据库名
            user='root',  # 数据库用户名
            passwd='root',  # 数据库密码
            charset='utf8',  # 编码方式
            use_unicode=True)
        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor();

    def process_item(self, item, spider):
        self.cursor.execute(
            """insert into chuanke(name, type, view, price ,teacher, url)
            value (%s, %s, %s, %s, %s, %s)""",  # 纯属python操作mysql知识,不熟悉请恶补
            (item['name'],  # item里面定义的字段和表字段对应
             item['type'],
             item['view'],
             item['price'],
             item['teacher'],
             item['url']))

        # 提交sql语句
        self.connect.commit()
        return item  # 必须实现返回
下一篇,我们将提供一个完整的实例,把以上知识串起来,通过scrapy把数据存入mysql!

相关文章