scrapy爬取数据保存到mysql数据库

之前一篇文章,写了scrapy入门博客。至于数据库建表也不再赘述。接下来介绍如何将数据进行mysql入库。

其实很简单,数据源都拿到了,入库就是信手拈来,着重介绍利用pymysql连接mysql数据库以及封装。

1.首先在settings里定义数据库连接属性:

地址:host、端口号:port、数据库名:dbname、用户名:user、密码:password

配置如下(根据自己的数据库实际修改):

#mysql数据库连接属性
MYSQL_HOST="xxx.xxx.xxx.xxx"
MYSQL_PORT=3306
MYSQL_DB="xxx"
MYSQL_USER="xxx"
MYSQL_PASSWD="xxx"

2.在项目目录下创建文件夹DBContrl,编写py文件MySQLHelper:

以下是MySQLHelper内容,代码块里每一步都有详细介绍。

# -*- code:utf-8 -*-

#导入pymysql包
import pymysql

#导入settings文件
from mySpider import settings


class MysqlHelper:
    #这里预留type选项是为了日后区分生产环境,个人测试学习也可不写
    def __init__(self,type="测试"):
        if type=="测试":
            #将settings文件内连接属性赋值给MysqlHelper类属性
            self.host=settings.MYSQL_HOST
            self.port=settings.MYSQL_PORT
            self.db=settings.MYSQL_DB
            self.user=settings.MYSQL_USER
            self.password=settings.MYSQL_PASSWD
            #编码方式:你要么写charset='utf8',要么写charset='utf8mb4'
            self.charset='utf8'

    #数据库链接配置
    def connect(self):
        self.conn = pymysql.connect(host=self.host,port=self.port,db=self.db,
                        user=self.user,passwd=self.password,
                        charset=self.charset,
                        cursorclass=pymysql.cursors.DictCursor
                        )
        #创建游标
        self.cursor=self.conn.cursor()

    #关闭连接
    def close(self):
        #先关闭游标
        self.cursor.close()
        #再关闭连接
        self.conn.close()

    #封装增删改查
    #增加
    def insert(self, sql, params=()):
        return self._edit( sql, params)

    # 删除
    def delete(self, sql, params=()):
        return self._edit(sql, params)

    # 修改
    def update(self, sql, params=()):
        return self._edit(sql, params)

    #增删改其实都是调用编辑
    def _edit(self, sql, params):
        count=0
        try:
            #开启连接
            self.connect()
            #执行游标
            count = self.cursor.execute(sql, params)
            #提交事物
            self.conn.commit()
            #关闭连接
            self.close()
        # 捕捉异常
        except Exception as e:
            #抛出异常并打印
            raise e
            print(e)
        #返回结果
        return count

    def get_one(self,sql, params=()):
        result=None
        try:
            # 开启连接
            self.connect()
            # 执行游标
            self.cursor.execute(sql,params)
            #获取单个
            result = self.cursor.fetchone()
            # 提交事物,select查询本身不需要事务提交。
            #self.conn.commit()
            # 关闭连接
            self.close()
            # 捕捉异常
        except Exception as e:
            # 抛出异常并打印
            raise e
            print(e)
            # 返回结果
        return result

    def get_all(self,sql,params):
        listResult=[]
        try:
            # 开启连接
            self.connect()
            # 执行游标
            self.cursor.execute(sql,params)
            #获取单个
            listResult = self.cursor.fetchall()
            # 提交事物,select查询本身不需要事务提交。
            #self.conn.commit()
            # 关闭连接
            self.close()
            # 捕捉异常
        except Exception as e:
            # 抛出异常并打印
            raise e
            print(e)
            # 返回结果
        return listResult

以上还封装了数据操作的增删改查,不用每次频繁的编写了。

3.接下来进行数据插入操作

在上文scrapy入门项目里的管道文件处理数据:

class FilmPipeline(object):
    def process_item(self,item,spider):
        #调用封装好的mysql工具类
        mysql = MysqlHelper()
        #编写插入语句
        sql="insert into film(name) values (%s)"
        #参数就是我们爬取到的数据
        params=[item["name"]]
        #执行封装好的插入方法
        result = mysql.insert(sql, params)
        #可以打印日志,看看效果
        print("插入数据成功",result)

执行film爬虫:

scrapy crawl film

ps:觉得日志眼花缭乱可以这样执行:scrapy crawl film --nolog,不会打印日志,默默工作。

最终顺利入库:

补充:其实入库的数据处理也可以在爬虫文件的parse方法里处理,写在管道里,更好的发挥scrapy的异步优势,看个人习惯吧~

猜你喜欢

转载自blog.csdn.net/harry5508/article/details/86494748