配置数据库
MYSQL_HOST = ‘localhost’
MYSQL_DB = ‘jobbole’
MYSQL_USER = ‘root’
MYSQL_PASSWD = ‘123456’
MYSQL_PORT = 3306
MYSQL_CHARSET = ‘utf8’
class MySQLTwistedPipeline(object):
def init(self, pool):
self.dbpool = pool
@classmethod
def from_settings(cls, settings):
"""
这个函数名称是固定的,当爬虫启动的时候,scrapy会自动调用这些函数,加载配置数据。
:param settings:
:return:
"""
params = dict(
host=settings['MYSQL_HOST'],
port=settings['MYSQL_PORT'],
db=settings['MYSQL_DB'],
user=settings['MYSQL_USER'],
passwd=settings['MYSQL_PASSWD'],
charset=settings['MYSQL_CHARSET'],
cursorclass=pymysql.cursors.DictCursor
)
# 创建一个数据库连接池对象,这个连接池中可以包含多个connect链接对象。
# 参数1:操作数据库的包名
# 参数2:链接数据库的参数
db_connect_pool = adbapi.ConnectionPool('pymysql', **params)
# 初始化这个类的对象
obj = cls(db_connect_pool)
return obj
def process_item(self, item, spider):
"""
在连接池中,开始执行数据的多线程写入操作。
:param item:
:param spider:
:return:
"""
# 参数1:在线程中被执行的sql语句
# 参数2:要保存的数据
result = self.dbpool.runInteraction(self.insert, item)
# 给result绑定一个回调函数,用于监听错误信息
result.addErrback(self.error)
def error(self, reason):
print('--------', reason)
def insert(self, cursor, item):
insert_sql = "INSERT INTO bole(bole_title, bole_date, bole_tag, bole_content, bole_dz, bole_sc, bole_pl, bole_img_src) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
cursor.execute(insert_sql, (item['bole_title'], item['bole_date'], item['bole_tag'], item['bole_content'], item['bole_dz'], item['bole_sc'], item['bole_pl'], item['bole_img_path']))
# 不需要commit()