保存到Mysql数据库,需要用到mysqlclient
模块,需要事先安装,这个模块在django也会用到。
1、数据同步插入数据库
在pipelines.py
中引入数据库连接模块:
import MySQLdb
写入以下代码
class MysqlPipeline(object):
def __init__(self):
self.conn = MySQLdb.connect('127.0.0.1', 'root', 'root', 'jobbole', charset='utf8', use_unicode=True)
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
insert_sql = 'INSERT INTO jobbole_article (`title`, `create_date`, `url`, `url_object_id`, `content`, `front_image_path`, `comment_nums`, `fav_nums`, `praise_nums`, `tags`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
self.cursor.execute(insert_sql, (item['title'], item['create_date'], item['url'], item['url_object_id'], item['content'], item["front_image_path"], item['comment_nums'], item['fav_nums'], item['praise_nums'], item['tags']))
self.conn.commit()
__init__
是对数据进行初始化,定义连接信息如host,数据库用户名、密码、数据库名称、数据库编码
在process_item
中进行插入数据操作,格式都是固定的
最后在settings.py
中把MysqlPipelint()
加入到系统中,需要注意的是优先级要小于之前加入处理图片路径的优先级
ITEM_PIPELINES = {
'articlespider.pipelines.ArticlespiderPipeline': 300, #系统自动生成pipeline,未用
'articlespider.pipelines.ArticleimagePipeline': 1,
'articlespider.pipelines.MysqlPipeline': 4,
}
说明:
先进行
ArticleimagePipeline
的处理,再进行MysqlPipeline
处理
2、异步插入数据库
在同步插入数据库中,把连接信息MySQLdb.connect('127.0.0.1', 'root', 'root', 'jobbole', charset='utf8', use_unicode=True)
直接定义在函数中,如果不经常改动的话,可以把相关信息放到settings.py
中进行调用。
在settings.py
中
MYSQL_HOST = "127.0.0.1"
MYSQL_DBNAME = "jobbole"
MYSQL_USER = "root"
MYSQL_PASSWORD = "root"
在pipelines.py
中,定义异常存储数据pipeline
class MysqlyibuPipeline(object):
@classmethod
def from_settings(cls, settings):
host = settings["MYSQL_HOST"]
pass
通过debug模式,可以看到相应的设置已经传递过来了。通过host = settings["MYSQL_HOST"]
赋值即可得到相应数据。
异步操作需要引入twisted:
from twisted.enterprise import adbapi
import MySQLdb
import MySQLdb.cursors
使用twisted进行操作
class MysqlyibuPipeline(object):
def __init__(self, dbpool):
self.dbpool = dbpool
@classmethod
def from_settings(cls, settings):
dbparms = dict(
host = settings["MYSQL_HOST"],
db = settings["MYSQL_DBNAME"],
user = settings["MYSQL_USER"],
passwd = settings["MYSQL_PASSWORD"],
charset='utf8',
cursorclass=MySQLdb.cursors.DictCursor,
use_unicode=True,
)
dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms)
return cls(dbpool)
def process_item(self, item, spider):
# 使用twisted将mysql插入变成异步执行
query = self.dbpool.runInteraction(self.do_insert, item)
query.addErrback(self.handle_error)
def handle_error(self, failure):
print(failure)
def do_insert(self, cursor, item):
# 具体执行插入
insert_sql = 'INSERT INTO jobbole_article (`title`, `create_date`, `url`, `url_object_id`, `content`, `front_image_path`, `comment_nums`, `fav_nums`, `praise_nums`, `tags`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
cursor.execute(insert_sql, (item['title'], item['create_date'], item['url'], item['url_object_id'], item['content'], item["front_image_path"], item['comment_nums'], item['fav_nums'], item['praise_nums'], item['tags']))
在使用中大部分代码无需改变,只在最后一步,改为自己的信息即可。当量不大时,使用第一种方法。