scrapy 基于管道的持久化存储操作

scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。
这两个组件配合爬虫文件实现数据持久化

items.py:数据结构模板文件。定义数据属性。
pipelines.py:管道文件。接收数据(items),进行持久化操作。

持久化流程:

1.爬虫文件爬取到数据后,需要将数据封装到items对象中。
2.使用yield关键字将items对象返回,自动提交给pipelines管道进行持久化操作。
3.在管道文件中的process_item方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象中存储的数据进行持久化存储
4.settings.py配置文件中开启管道

爬虫文件(qiushi.py)

import scrapy
from learn_scrapy.items import LearnScrapyItem   # 导入items

class QiushiSpider(scrapy.Spider):
    name = 'qiushi'
    # allowed_domains = ['www.web.com']
    start_urls = ['https://www.qiushibaike.com/']

    def parse(self, response):
        li_list = response.xpath('//*[@id="content"]/div/div[2]/div/ul/li')
        for li in li_list:
            title = li.xpath('./div/a/text()')[0].extract()
            author = li.xpath('./div/div/a/span/text()')[0].extract()

            item = LearnScrapyItem()
            # 将数据封装到items对象中。
            item['title'] = title
            item['author'] = author
            # 使用yield关键字将items对象返回
            yield item

数据结构模板文件,定义数据属性(items.py)

import scrapy


class LearnScrapyItem(scrapy.Item):
    author = scrapy.Field()
    title = scrapy.Field()

管道文件(pipelines.py)

from itemadapter import ItemAdapter


class LearnScrapyPipeline:
    def __init__(self):
        self.fp = None

    """
        下列都是在重写父类方法
    """
    #开始爬虫时,执行一次
    def open_spider(self, spider):
        print('start spider')
        self.fp = open('data.txt', 'w')

    # 在爬虫运行中会频繁调用
    def process_item(self, item, spider):
        self.fp.write(item['author'] + ':' + item['title'] + '\n')
        return item

    #结束爬虫时,执行一次
    def close_spider(self, spider):
        self.fp.close()
        print('spider end')

猜你喜欢

转载自www.cnblogs.com/bibicode/p/13385085.html