import pymysql class MysqlPipeline(object): def __init__(self): self.conn = None self.cur = None def open_spider(self, spider):
# 连接数据库 self.conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='密码', db='数据库名', charset='utf8mb4' # 编码格式 ) self.cur = self.conn.cursor() # 游标 def process_item(self, item, spider): if not hasattr(item, 'table_name'): # 表设计为有table——name的item的存入mYsql数据库,无则直接返回item return item cols, values = zip(*item.items()) # 使用zip方法取cols和values列表 sql = "INSERT INTO `{}` ({}) VALUES " \ # sql语句 "({}) ON DUPLICATE KEY UPDATE {}".format( # on 为避免爬取到相同数据插入数据库后报错 使用更新方式插入 item.table_name, ','.join(['`%s`' % k for k in cols]), ','.join(["%s"] * len(values)), ','.join(["{}=%s".format(k) for k in cols]) ) self.cur.execute(sql, values * 2) # 执行sql语句 values作为第二个参数而不是直接在sql语句中这种写法可以防sql语句注入 print(self.cur._last_executed) # 打印 调试用 self.conn.commit() # 提交 存储到数据库 return item def close_spider(self, spider): self.cur.close() # 关闭游标 self.conn.close() # 关闭数据库