Scrapy中将item转存到数据库


sqlite数据库

在pipelines.py中添加一个新的类:SQLitePipeline,如下内容

import sqlite3 #导入sqlite3模块


class SQLitePipeline(object):#创建一个新的类,用来做保存数据到数据库的工作
    def __init__(self,dbname):
        self.dbname = dbname#初始化数据库名称,sqlite数据库是一个文件,dbname写成文件名就行,如果在当前目录下,就只写文件名,如果不在,请写上绝对路径

    @classmethod#是一个类方法,用@classmethod标识
    def from_crawler(cls,crawler):#他的参数crawler,我们就可以拿到scrapy的所有核心组件,如全局配置的每个信息,然后创建一个pipeline实例,参数cls就是class
        return cls(dbname=crawler.settings.get('DBNAME'))
        #最后返回一个class实例,在settings.py中加入:DBNAME = "你的数据库的名称,如果在当前目录下,就只写文件名,如果不在,请写上绝对路径"

    def open_spider(self,spider):#该方法在spider被打开的时候开启,我们可以在这里做一些初始化工作
        self.conn = sqlite3.connect(self.dbname)#如连接数据库
        self.cx = self.conn.cursor()#创建游标

    def process_item(self,item,spider):#该方法才是实际用来存储数据的
        data = dict(item)#将item变成字典形式
        keys = ','.join(data.keys())#将字典的键值做成“,”隔开的字符串
        values = ','.join(['%s'] * len(data))#根据data字典的长度建立对应长度数的“%s”
        sql = 'insert into TableName(%s) values (%s)' %(keys,tuple(data.values()))
        self.cx.execute(sql)#执行sql语句
        self.conn.commit()#提交
        return item#返回item

    def close_spider(self,spider):#该方法在spider被关闭的时候打开,我们可以在这里做一些收尾工作,
        self.conn.close()#例如:关闭数据库

然后在settings.py中打开管道文件:

ITEM_PIPELINES = {
    'zhilianzhaopin.pipelines.SQLitePipeline': 300,
}

设置DBNAME

DBNAME = "你的数据库的名称" #,如果在当前目录下,就只写文件名,如果不在,请写上绝对路径

MySQL数据库

在pipelines中添加一个新的类:MySQLPipeline

import pymysql #导入pymysql模块,用来操作MySQL数据库

class MySQLPipeline():
    def __init__(self,host,database,user,password,port):
        self.host = host
        self.database = database
        self.user = user
        self.password = password
        self.port = port

    @classmethod#是一个类方法,用@classmethod标识
    def from_crawler(cls,crawler):#他的参数crawler,我们就可以拿到scrapy的所有核心组件,如全局配置的每个信息,然后创建一个pipeline实例,参数cls就是class
        return cls(
                host=crawler.settings.get('MYSQL_HOST')
                database=crawler.settings.get('MYSQL_DATABASE')
                user=crawler.settings.get('MYSQL_USER')
                password=crawler.settings.get('MYSQL_PASSWORD')
                port=crawler.settings.get('MYSQL_PORT')

        )

    def open_spider(self,spider):#该方法在spider被打开的时候开启,我们可以在这里做一些初始化工作
        self.db = pymysql.connect(self.host,self.database,self.user,self.password,charset='utf8',self.port)#如连接数据库
        self.cursor = self.db.cursor()#创建游标

    def process_item(self,item,spider):#该方法才是实际用来存储数据的
        data = dict(item)#将item变成字典形式
        keys = ','.join(data.keys())#将字典的键值做成“,”隔开的字符串
        values = ','.join(['%s'] * len(data))#根据data字典的长度建立对应长度数的“%s”
        sql = 'insert into TableName(%s) values (%s)' %(keys,tuple(data.values()))
        self.cx.execute(sql)#执行sql语句
        self.conn.commit()#提交
        return item#返回item

    def close_spider(self,spider):#该方法在spider被关闭的时候打开,我们可以在这里做一些收尾工作,
        self.conn.close()#例如:关闭数据库

然后在settings.py中打开管道文件:

ITEM_PIPELINES = {
    'zhilianzhaopin.pipelines.MySQLPipeline': 300,
}

设置变量

MYSQL_HOST = “127.0.0.1”
MYSQL_DATABASE = “数据库名称”
MYSQL_USER = “用户名”
MYSQL_PASSWORD = “密码”
MYSQL_PORT = 3306


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM