之前一篇文章,写了scrapy入门博客。至于数据库建表也不再赘述。接下来介绍如何将数据进行mysql入库。
其实很简单,数据源都拿到了,入库就是信手拈来,着重介绍利用pymysql连接mysql数据库以及封装。
地址:host、端口号:port、数据库名:dbname、用户名:user、密码:password
配置如下(根据自己的数据库实际修改):
#mysql数据库连接属性
MYSQL_HOST="xxx.xxx.xxx.xxx"
MYSQL_PORT=3306
MYSQL_DB="xxx"
MYSQL_USER="xxx"
MYSQL_PASSWD="xxx"
以下是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
以上还封装了数据操作的增删改查,不用每次频繁的编写了。
在上文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的异步优势,看个人习惯吧~