scrapy爬取数据进行数据库存储和本地存储

Posted 笑看人世冷暖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy爬取数据进行数据库存储和本地存储相关的知识,希望对你有一定的参考价值。

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


1.本地存储

    设置pipel ines.py

  1. class Ak17Pipeline(object):
  2.    def __init__(self):
  3.        self.file = open(‘ak17.json‘, ‘w‘)     # 存储文件的类型
  4.    def process_item(self, item, spider):
  5.        result = json.dumps(dict(item), ensure_ascii=False) + ‘,\n‘
  6.        self.file.write(result)
  7.        return item
  8.    def close_spider(self):
  9.        self.file.close()

2. 存储到MongoDB数据库

    设置setting文件

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

设置pipel ines.py
  1. class MongoPipeline(object):
  2.    """
  3.    保存进数据库
  4.    """
  5.    def __init__(self):
  6.        # 初始化操作
  7.        host = settings[‘MONGO_HOST‘]
  8.        port = settings[‘MONGO_PORT‘]
  9.        dbs = settings[‘MONGO_DBNAME‘]
  10.        colname = settings[‘MONGO_COLNAME‘]
  11.        # 链接数据库
  12.        self.db = MongoClient(host=host, port=port)
  13.        # 选择数据库
  14.        self.database = self.db[dbs]
  15.        # 选择集合
  16.        self.col = self.database[colname]
  17.    def process_item(self, item, spider):
  18.        # 插入数据
  19.        date = dict(item)
  20.        self.col.insert(date)
  21.        return item
  22.    def close_spider(self):
  23.        # 关闭链接
  24.        self.db.close()

3.mysql数据库存储

 设置setting文件

  1. MYSQL_HOSTS = ‘127.0.0.1‘
  2. MYSQL_USER = ‘root‘
  3. MYSQL_PASSWORD = ‘root‘
  4. MYSQL_PORT = 3306
  5. MYSQL_DB=‘xiciip‘
  6. CHARSET=‘utf8‘

设置pipel ines.py
  1. class WebcrawlerScrapyPipeline(object):
  2.    ‘‘‘保存到数据库中对应的class
  3.       1、在settings.py文件中配置
  4.       2、在自己实现的爬虫类中yield item,会自动执行‘‘‘
  5.    def __init__(self, dbpool):
  6.        self.dbpool = dbpool
  7.    @classmethod
  8.    def from_settings(cls, settings):
  9.        ‘‘‘1、@classmethod声明一个类方法,而对于平常我们见到的叫做实例方法。
  10.           2、类方法的第一个参数cls(class的缩写,指这个类本身),而实例方法的第一个参数是self,表示该类的一个实例
  11.           3、可以通过类来调用,就像C.f(),相当于java中的静态方法‘‘‘
  12.        #读取settings中配置的数据库参数
  13.        dbparams = dict(
  14.            host=settings[‘MYSQL_HOST‘],  
  15.            db=settings[‘MYSQL_DBNAME‘],
  16.            user=settings[‘MYSQL_USER‘],
  17.            passwd=settings[‘MYSQL_PASSWD‘],
  18.            charset=‘utf8‘,  # 编码要加上,否则可能出现中文乱码问题
  19.            cursorclass=MySQLdb.cursors.DictCursor,
  20.            use_unicode=False,
  21.        )
  22.        dbpool = adbapi.ConnectionPool(‘MySQLdb‘, **dbparams)  # **表示将字典扩展为关键字参数,相当于host=xxx,db=yyy....
  23.        return cls(dbpool)  # 相当于dbpool付给了这个类,self中可以得到
  24.    # pipeline默认调用
  25.    def process_item(self, item, spider):
  26.        query = self.dbpool.runInteraction(self._conditional_insert, item)  # 调用插入的方法异步处理
  27.        query.addErrback(self._handle_error, item, spider)  # 调用异常处理方法
  28.        return item
  29.    # 写入数据库中
  30.    # SQL语句在这里
  31.    def _conditional_insert(self, tx, item):
  32.        sql = "insert into jsbooks(author,title,url,pubday,comments,likes,rewards,views) values(%s,%s,%s,%s,%s,%s,%s,%s)"
  33.        params = (item[‘author‘], item[‘title‘], item[‘url‘], item[‘pubday‘],item[‘comments‘],item[‘likes‘],item[‘rewards‘],item[‘reads‘])
  34.        tx.execute(sql, params)
  35.    # 错误处理方法
  36.    def _handle_error(self, failue, item, spider):
  37.        print failue


以上是关于scrapy爬取数据进行数据库存储和本地存储的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy学习第八课

爬虫--Scrapy-持久化存储操作2

Scrapy实战篇之爬取360图片数据和图片

Scrapy持久化存储

Scrapy爬取全站数据并存储到数据库和文件中

论Scrapy中的数据持久化