zoukankan      html  css  js  c++  java
  • scrapy爬取数据进行数据库存储和本地存储

         今天记录下scrapy将数据存储到本地和数据库中,不是不会写,因为小编每次都写觉得都一样,所以记录下,以后直接用就可以了-^o^-

    1.本地存储

        设置pipel ines.py

    class Ak17Pipeline(object):
        def __init__(self):
            self.file = open('ak17.json', 'w')     # 存储文件的类型
        def process_item(self, item, spider):
            result = json.dumps(dict(item), ensure_ascii=False) + ',\n'
            self.file.write(result)
            return item
        def close_spider(self):
            self.file.close()

    2. 存储到MongoDB数据库

        设置setting文件

    # mongo数据库
    MONGO_HOST = "127.0.0.1"    # 数据库地址
    MONGO_PORT = 27017      # 端口号
    MONGO_DBNAME = "ak17"    # 数据库名称
    MONGO_COLNAME = "ak"     #  集合名称

     设置pipel ines.py

    class MongoPipeline(object):
        """
        保存进数据库
        """
        def __init__(self):
            # 初始化操作
            host = settings['MONGO_HOST']
            port = settings['MONGO_PORT']
            dbs = settings['MONGO_DBNAME']
            colname = settings['MONGO_COLNAME']
            # 链接数据库
            self.db = MongoClient(host=host, port=port)
            # 选择数据库
            self.database = self.db[dbs]
            # 选择集合
            self.col = self.database[colname]
        def process_item(self, item, spider):
            # 插入数据
            date = dict(item)
            self.col.insert(date)
            return item
        def close_spider(self):
            # 关闭链接
            self.db.close()

    3.MySql数据库存储

     设置setting文件

    MYSQL_HOSTS = '127.0.0.1'
    MYSQL_USER = 'root'
    MYSQL_PASSWORD = 'root'
    MYSQL_PORT = 3306
    MYSQL_DB='xiciip'
    CHARSET='utf8'

    设置pipel ines.py

    class WebcrawlerScrapyPipeline(object):
        '''保存到数据库中对应的class
           1、在settings.py文件中配置
           2、在自己实现的爬虫类中yield item,会自动执行'''
        def __init__(self, dbpool):
            self.dbpool = dbpool
        @classmethod
        def from_settings(cls, settings):
            '''1、@classmethod声明一个类方法,而对于平常我们见到的叫做实例方法。
               2、类方法的第一个参数cls(class的缩写,指这个类本身),而实例方法的第一个参数是self,表示该类的一个实例
               3、可以通过类来调用,就像C.f(),相当于java中的静态方法'''
            #读取settings中配置的数据库参数
            dbparams = dict(
                host=settings['MYSQL_HOST'],  
                db=settings['MYSQL_DBNAME'],
                user=settings['MYSQL_USER'],
                passwd=settings['MYSQL_PASSWD'],
                charset='utf8',  # 编码要加上,否则可能出现中文乱码问题
                cursorclass=MySQLdb.cursors.DictCursor,
                use_unicode=False,
            )
            dbpool = adbapi.ConnectionPool('MySQLdb', **dbparams)  # **表示将字典扩展为关键字参数,相当于host=xxx,db=yyy....
            return cls(dbpool)  # 相当于dbpool付给了这个类,self中可以得到
        # pipeline默认调用
        def process_item(self, item, spider):
            query = self.dbpool.runInteraction(self._conditional_insert, item)  # 调用插入的方法异步处理
            query.addErrback(self._handle_error, item, spider)  # 调用异常处理方法
            return item
        # 写入数据库中
        # SQL语句在这里
        def _conditional_insert(self, tx, item):
            sql = "insert into jsbooks(author,title,url,pubday,comments,likes,rewards,views) values(%s,%s,%s,%s,%s,%s,%s,%s)"
            params = (item['author'], item['title'], item['url'], item['pubday'],item['comments'],item['likes'],item['rewards'],item['reads'])
            tx.execute(sql, params)
        # 错误处理方法
        def _handle_error(self, failue, item, spider):
            print failue
  • 相关阅读:
    防止SQL注入
    Sql Server参数化查询之where in和like实现详解
    NET下载文件报错System.UnauthorizedAccessException的解决方法
    hibernate 中的session和事务(Transaction)
    ASP.net MVC 文件下载的几种方法
    SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句
    NHibernate 中删除数据的几种方法
    SQL、LINQ、Lambda 三种用法(转)
    .net MVC 单页面 多个(行)数据修改
    绘制你的第一个图表(jquery-flot-line-chart)
  • 原文地址:https://www.cnblogs.com/syketw23/p/7667748.html
Copyright © 2011-2022 走看看