以下操作 是在 一个 完整的 scrapy 项目中 添加 代码:
中间件 和 spiders 中的代码 都不需要修改 只需要 做下面两件事就可以将数据保存到数据库了,不过在写代码之前 我们要先:
-
在终端 执行命令:net start mysql57 开启 mysql 服务器
-
创建数据库,在数据库中创建与要保存相关的数据的表(名称要与框架中的名称一样, 表中创建的 字段名称 也要跟 框架中 需要保存字段 名 一致)(利用图形化界面工具创建起来方便些:Navicat Premium)
-
创建好数据库和表之后 先测试一下 数据库能否连接成功
'''
测试数据库是否连接成功
'''
import pymysql
conn=pymysql.connect(host='127.0.0.1',port=3306,user='数据库名称',password='数据库密码',db='表名',charset='utf8')
print(conn)
输出结果为:<pymysql.connections.Connection object at 0x000000000220D7B8>
则表示数据库连接成功 如果报错则失败
当数据库连接成功了之后, 接下来 我们就开始在scrappy框架中进 "装修" :
1:配置环境 在setting文件中加入: sql数据库参数 和 pipelines管道配置:
# 设置管道中类的优先级
ITEM_PIPELINES = {
'movie.pipelines.MoviePipeline': 300, # 管道中自带的类,优先级默认第一
'movie.pipelines.MovieMysqlPipeline': 200, # 管道中 新建的类 用来保存数据到数据库
}
# 连接数据库
# 填的 是所保存数据库的信息
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = '用户名'
DB_PASSWORD = '密码'
# 数据库名称
DB_DB = 'movies'
DB_CHARSET = 'utf8'
2 : 管道中 新建一个类 用来保存数据到数据库 :
(下面代码中 关于数据库的一下东西是博主自己 , 请自行修改 )
import pymysql
from scrapy.utils.project import get_project_settings
# 保存数据到mysql数据库(数据去重)
class WeimobMysqlPipeline(object):
def __init__(self):
setting = get_project_settings()
self.host = setting.get("DB_HSOT")
self.port = setting.get("DB_PORT")
self.user = setting.get("DB_USER")
self.password = setting.get("DB_PASSWORD")
self.db = setting.get("DB_DB")
self.charset = setting.get("DB_CHARSET")
self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, db=self.db, charset=self.charset)
# 创建游标 通过cursor 执行 sql语句
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
try:
# 查重处理
self.cursor.execute('select * from agents where agent = %s and agent_company= %s',(item['agent'], item['agent_company']))
# 查看是否有重复的数据
repetition = self.cursor.fetchone()
#重复
if repetition:
# 打印一下
print('数据重复',item['agent'],item['agent_company'])
else:
# 插入数据
self.cursor.execute('insert into agents(agent,agent_company) values("%s","%s") '%(item['agent'],item['agent_company']))
#提交sql语句
self.conn.commit()
except Exception as error:
print(error)
return item
def close_spider(self, spider):
# 关闭 游标
self.cursor.close()
# 关闭 连接
self.conn.close()