【爬虫】scrapy持久化存储

目录

基于终端指令

基于管道

编码流程


基于终端指令

  • 要求:只可以将parse方法的返回值存储到本地文本文件中
  • 注意:存储类型有限制,见终端截图1
  • 指令:scrapy crawl 爬虫名 -o 路径
  • 优点:简洁高效便捷
  • 缺点:局限性较强,后缀有限
import scrapy


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

    def parse(self, response):
        # 解析作者名称、段子内容
        div_list = response.xpath('//div[@class="col1 old-style-col1"]/div')
        all_data = []  # 存储所有解析到的数据
        for div in div_list:
            # extract()可以将selector对象中的data参数存储的字符串提取出来
            author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            # 列表调用extract()之后,将列表中的每一个selector对象中data对应字符串提取出来
            content = div.xpath('./a[1]/div/span//text()').extract()
            # 将列表转成字符串
            content = ''.join(content)
            # # 仅打印第一个作者和段子,查看返回内容
            # print(author, content)
            # break

            dic = {
                'author': author,
                'content': content
            }
            all_data.append(dic)

        return all_data
    
终端截图
终端截图1

 

基于管道

编码流程

  1. 数据解析
    import scrapy
    from qiubaiPro.qiubaiPro.items import QiubaiproItem  # 导入item类
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai'
        # allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.qiushibaike.com/text/']
    
    # 基于管道的持久化存储
        def parse(self, response):
            # 解析作者名称、段子内容
            div_list = response.xpath('//div[@class="col1 old-style-col1"]/div')
            all_data = []  # 存储所有解析到的数据
            for div in div_list:
                # extract()可以将selector对象中的data参数存储的字符串提取出来
                author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
                # 列表调用extract()之后,将列表中的每一个selector对象中data对应字符串提取出来
                content = div.xpath('./a[1]/div/span//text()').extract()
                # 将列表转成字符串
                content = ''.join(content)
                # 实例化item类
                item = QiubaiproItem()
                # 将爬取到的封装到item的属性中
                item['author'] = author
                item['content'] = content
                # 向管道提交item,提交多次。每提交一次管道中的process_item方法执行一次
                yield item
    

     

  2. 在item类中定义相关属性
    item类
  3. 将解析的数据封装存储到item类型的对象
  4. 将item对象提交给管道进行持久化存储
    import scrapy
    from qiubaiPro.qiubaiPro.items import QiubaiproItem  # 导入item类
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai'
        # allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.qiushibaike.com/text/']
    
    # 基于管道的持久化存储
        def parse(self, response):
            # 解析作者名称、段子内容
            div_list = response.xpath('//div[@class="col1 old-style-col1"]/div')
            all_data = []  # 存储所有解析到的数据
            for div in div_list:
                # extract()可以将selector对象中的data参数存储的字符串提取出来
                author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
                # 列表调用extract()之后,将列表中的每一个selector对象中data对应字符串提取出来
                content = div.xpath('./a[1]/div/span//text()').extract()
                # 将列表转成字符串
                content = ''.join(content)
                # 实例化item类
                item = QiubaiproItem()
                # 将爬取到的封装到item的属性中
                item['author'] = author
                item['content'] = content
                # 向管道提交item,提交多次。每提交一次管道中的process_item方法执行一次
                yield item
    

     

  5. 在管道类的process_item方法中对item携带的数据进行持久化存储
    class QiubaiproPipeline:
        fp = None
        # 重写父类的方法,该方法只在开始爬虫的时候被调用一次
        def open_spider(self, spider):
            print('开始爬虫。。。')
            self.fp = open('./qiubai.txt', 'w', encoding='utf-8')
    
        # 专门处理item对象
        # 接收爬虫文件提交过来的item对象
        def process_item(self, item, spider):
            # 取出数据
            author = item['author']
            content = item['content']
    
            # 存储
            self.fp.write(author+':\n'+content+'\n')
    
            return item
    
        def close_spider(self, spider):
            print('结束爬虫。。。')
            self.fp.close()
    管道类
  6. 在配置文件中开启管道
    配置文件
    开启
    UA伪装等

 执行结果:

终端截图2

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值