scrapy的数据持久化存储

方法一、基于终端命令

parse方法中存在一个返回值,一般是字典或者列表,将该返回值存储到本地文件中,只需要执行指令:scrapy crawl xxx -o filePath
该方法简洁高效,但是数据只能存储到指定类型的文件中,局限性叫强

 Set a supported one (('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')) after a colon at the end of the output URI (i.e. -o/-O <UR
I>:<FORMAT>) or as a file extension.
方法二、基于管道的持久化存储

实现流程:

  1. parse方法中进行数据解析
  2. 对取得的数据进行分析整合,在item.py文件中定义相关的属性,将解析到的数据整合存储到item类型的对象中去
  3. 将item类型的对象交给管道进行持久化存储
  4. 在pipelines.py文件中的process_item方法中通过return item将接受到的数据进行持久化存储
  5. 在settings.py中开启管道
基于管道的持久化存储的爬虫案例

爬虫文件

import scrapy
from qiushibaike.items import QiushibaikeItem

class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ['https://www.qiushibaike.com/imgrank/']
    start_urls = ['https://www.qiushibaike.com/imgrank/']


    def parse(self, response):
        div_list = response.xpath('//div[contains(@class,"col1")]/div')
        for li in div_list:
            # 解析数据
            name = li.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            content = li.xpath('./a[1]/div[1]/span/text()')[0].extract()
            # 去除空行
            name = name.strip('\n')
            content = content.strip('\n')
            # 实例化一个item对象
            item = QiushibaikeItem()
            item['author'] = name
            item['content'] = content
            yield item

item.py

import scrapy

class QiushibaikeItem(scrapy.Item):
# 定义item对象中的属性
    author = scrapy.Field()
    content = scrapy.Field()

piplines.py

class QiushibaikePipeline:
    def __init__(self):
        self.fp = None
    # 若直接在process_item方法中打开data.txt文件,那么该操作会执行多次,即文件会被重复打开
    # 将文件的开启和关闭分别写在open_spider和close_spider方法中,使得该操作只执行一次
    def open_spider(self, spider):
        print('爬虫开始.....')
        self.fp = open('./data.txt', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        self.fp.write(item['author'] + ":" + item['content'] + '\n')
        return item

    def close_spider(self, spider):
        self.fp.close()
        print("爬虫结束")

settings.py

# 开启通道
ITEM_PIPELINES = {
   'qiushibaike.pipelines.QiushibaikePipeline': 300,
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值