返回顶部
首页 > 资讯 > 后端开发 > Python >Scrapy持久化存储
  • 376
分享到

Scrapy持久化存储

持久Scrapy 2023-01-30 23:01:57 376人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

基于终端指令的持久化存储   保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行

基于终端指令的持久化存储

  保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作;

执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储

    scrapy crawl 爬虫名称 -o xxx.JSON
    scrapy crawl 爬虫名称 -o xxx.xml
    scrapy crawl 爬虫名称 -o xxx.csv

基于管道的持久化存储

  scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可:

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

    pipelines.py : 管道文件,接受item类型的数据,进行持久化操作;

持久化流程:

  1. 在爬虫文件中获取到数据后,将数据封装到 items对象中;
  2. 通过 yield 关键字将items对象提交给pipelines管道进行持久化操作;
  3. 在管道文件中的process_item方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象存储的数据进行持久化存储;

settings.py文件中开启管道:

ITEM_PIPELINES = {
    'qiubaiPro.pipelines.QiubaiproPipelineByRedis': 300,
}

终端持久化存储示例:

  将糗事百科首页中的段子和作者数据爬取下来,然后进行持久化存储

爬虫程序

# -*- coding: utf-8 -*-
import scrapy


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

    def parse(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')
        all_data = []
        # xpath返回的列表元素类型为Selector类型
        for div in div_list:
            # title = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()')[0].extract()
            author = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()').extract_first()
            content = div.xpath('./a[1]/div/span/text()').extract_first()

            dic = {
                'author': author,
                'content': content
            }

            all_data.append(dic)
        # 基于终端指令的持久化存储:可以通过终端指令的形式将parse方法的返回值中存储的数据进行本地磁盘的持久化存储
        return all_data

settings

BOT_NAME = 'qiubaiPro'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWEBKit/537.36 (Khtml, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
SPIDER_MODULES = ['qiubaiPro.spiders']
NEWSPIDER_MODULE = 'qiubaiPro.spiders'
ROBOTSTXT_OBEY = False

执行:

scrapy crawl qiubai -o qiubai.csv

执行完之后的结果:

管道持久化存储示例:

爬取Boss直聘网中python爬虫岗位的职位名称,薪资,公司名称

爬虫程序

# -*- coding: utf-8 -*-
import scrapy
from bossPro.items import BossproItem


class BossSpider(scrapy.Spider):
    name = 'boss'
    allowed_domains = ['www.xxx.com']
    start_urls = ['Https://www.zhipin.com/job_detail/?query=python爬虫&scity=101010100&industry=&position=']

    def parse(self, response):
        li_list = response.xpath('//div[@class="job-list"]/ul/li')
        for li in li_list:
            title = li.xpath('.//div[@class="info-primary"]/h3[@class="name"]/a/div/text()').extract_first()
            salary = li.xpath('.//div[@class="info-primary"]/h3[@class="name"]/a/span/text()').extract_first()
            company = li.xpath('.//div[@class="company-text"]/h3/a/text()').extract_first()

            # 实例化一个item类型的对象
            item = BossproItem()
            # 将解析到的数据存储到item对象中
            item["title"] = title
            item["salary"] = salary
            item["company"] = company

            # 将item对象提交给管道进行持久化存储
            yield item

items

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class BossproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    salary = scrapy.Field()
    company = scrapy.Field()

pipelines

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

# 管道文件:需要接收爬虫文件提交过来的数据,并对数据进行持久化存储.(IO操作)
class BossproPipeline(object):
    fp = None
    # 只会被执行一次(开始爬虫的时候执行一次)
    def open_spider(self,spider):
        print("开始爬虫")
        self.fp = open('./job.txt','w',encoding='utf-8')
    # 爬虫文件每提交一次,该方法就会被调用一次
    def process_item(self, item, spider): #300表示为优先级,值越小优先级越高
        self.fp.write(item['title'] + "\t" + item['salary'] + '\t' + item['company'] + '\n')
        return item
    # 结束爬虫时执行
    def close_spider(self,spider):
        self.fp.close()
        print("爬虫结束")

# 注意:默认情况下,管道机制并没有开启,需要手动在配置文件中进行开启

# 使用管道进行持久化的流程:
#   1.获取解析到的数据
#   2.将解析的数据存储到item对象(item类中进行相关属性的声明)
#   3.通过yield关键字将item提交到管道
#   4.管道文件中进行持久化存储代码的编写(process_item)
#   5.在配置文件中开启管道

settings

#开启管道
ITEM_PIPELINES = {
    'secondblood.pipelines.SecondbloodPipeline': 300, #300表示为优先级,值越小优先级越高
}

执行:

scrapy crawl boss --nolog

基于Mysql的持久化存储

pipelines

import pymysql
class mysqlPipeline(object):
    conn = None
    cursor = None
    def open_spider(self,spider):
        self.conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', passWord='', db='spider')
        print(self.conn)
    def process_item(self, item, spider):
        self.cursor = self.conn.cursor()
        sql = 'insert into boss values("%s","%s","%s")'%(item['title'],item['salary'],item['company'])
        try:
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            print (e)
            self.conn.rollback()

    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()

settings

# 开启管道,自定义管道向不用的数据库存储数据
# 300是优先级,数字越小,优先级越高
 
ITEM_PIPELINES = {
   'boss.pipelines.BossPipeline': 300,
   'boss.pipelines.mysqlPipeLine': 301,
}

执行爬虫程序,并去数据库中查看数据

基于redis管道存储

 pipelines

from redis import Redis
class RedisPipeline(object):
    conn = None
    def process_item(self,item,spider):
        dic = {
            "title":item["title"],
            "salary":item["salary"],
            "company":item["company"]
        }
        self.conn.lpush("jobInfo",json.dumps(dic))
    def open_spider(self,spider):
        self.conn = Redis(host='127.0.0.1',port=6379)
        print (self.conn)

settings

ITEM_PIPELINES = {
   #'bossPro.pipelines.BossproPipeline': 300,
   #'bossPro.pipelines.mysqlPipeline': 301,
   'bossPro.pipelines.RedisPipeline': 302,
}

执行代码并且查看redis中的数据

redis已经存在数据了,因为编码问题所以不显示中文.

 

--结束END--

本文标题: Scrapy持久化存储

本文链接: https://lsjlt.com/news/180828.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Scrapy持久化存储
    基于终端指令的持久化存储   保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行...
    99+
    2023-01-30
    持久 Scrapy
  • redis持久化存储
    redis持久化存储 redis持久化存储 redis多被用于缓存和消息中间件,当被用作缓存时,数据的读写都是在内存中进行的,而内存一旦在主机断电或者主机重启时里面的数据将被清空,为保证数据不被丢失,r...
    99+
    2020-12-12
    redis持久化存储
  • Redis持久化存储详解
    为什么要做持久化存储 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会...
    99+
    2018-04-22
    Redis持久化存储详解
  • Redis持久化存储(AOF与RDB)
    Redis持久化存储 一部分转自: https://blog.csdn.net/canot/article/details/52886923 不能说的秘密的博客 求知若饥,虚心若愚 一部分来自: http://redis.io/topics...
    99+
    2015-06-04
    Redis持久化存储(AOF与RDB)
  • Redis持久化存储详解(一)
    为什么要做持久化存储 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的丢失,因为当服...
    99+
    2024-04-02
  • redis持久化存储是什么
    这篇文章主要介绍redis持久化存储是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!redis概述 REmote DIctionary Server(Redis)是一个基于key...
    99+
    2024-04-02
  • redis怎么做持久化存储
    Redis可以通过持久化存储来保证数据的持久性。Redis提供了两种持久化存储的方式:1. RDB(Redis Database)持...
    99+
    2023-09-04
    redis
  • ActiveMQ(09):ActiveMQ消息存储持久化
    一、简介1.1 描述 ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式、重新投递等1.2 PTP与PUB/SUB1.2....
    99+
    2024-04-02
  • 将SpringCloud ConfigServer持久化存储改为MySQL
    原文发布于:http://www.gufeng.tech/   谷风的个人主页1.背景      SpringCloud的ConfigServer默认是持久...
    99+
    2024-04-02
  • Kubernetes的持久化存储解决方法
    本篇内容介绍了“Kubernetes的持久化存储解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概述...
    99+
    2024-04-02
  • Redis持久化存储机制是什么
    这篇文章主要讲解了“Redis持久化存储机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis持久化存储机制是什么”吧!Redis 的数据全部在内存里,如果突然宕机,数据就会全部...
    99+
    2023-06-27
  • Kubernetes中怎么配置持久化存储
    在Kubernetes中配置持久化存储通常涉及使用持久卷(Persistent Volume)和持久卷声明(Persistent V...
    99+
    2024-04-09
    Kubernetes
  • python:pickle模块,持久存储
    pickle模块,他是用来保存和加载python数据对象的(是python的专有格式文件,其他语言无法识别),数据用dump保存到文件,用load加载(第一次看到这模块的作用,我就想到了有些单机游戏保存游戏进度的功能),cPickle模块是...
    99+
    2023-01-31
    持久 模块 python
  • python持久化存储文件操作方法
    存储文件的重要 一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,。 默认数据是加载到内存中,结果也是保存到内存中, 程序执行...
    99+
    2024-04-02
  • PHP Session 跨域的持久化存储方案
    随着互联网应用的开发日益复杂,Web 应用程序的跨域访问问题也日益突出。在跨域访问中,Web 应用程序需要在不同的域之间共享和传递数据。而 PHP Session 是一种常用的会话管理机制,在跨域访问中也需要考虑如何实现 Session 的...
    99+
    2023-10-21
    PHP Session 跨域 持久化存储方案
  • 一文读懂 K8s 持久化存储流程
    作者 | 孙志恒(惠志) 阿里巴巴开发工程师导读:众所周知,K8s 的持久化存储(Persistent Storage)保证了应用数据独立于应用生命周期而存在,但其内部实现却少有人提及。K8s 内部的存储流程到底是怎样的?PV、PVC、S...
    99+
    2023-06-04
  • Ruby序列化和持久化存储怎么实现
    这篇文章主要介绍“Ruby序列化和持久化存储怎么实现”,在日常操作中,相信很多人在Ruby序列化和持久化存储怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ruby序列化和持久化存储怎么实现”的疑惑有所...
    99+
    2023-06-30
  • Netdata的监控数据是否支持持久化存储
    是的,Netdata的监控数据支持持久化存储。 Netdata可以配置为将监控数据存储在本地磁盘上,以便稍后进行分析和检查。此外,N...
    99+
    2024-04-24
    Netdata
  • 云原生技术持久化存储PV与PVC
    目录1.PV与PVCPV:PVC:2.PV资源回收Retain:保留资源Delete:删除数据Recycle:回收(弃用)3.访问模式4.存储分类文件存储(Filesystem):块...
    99+
    2024-04-02
  • kubernetes中部署mysql集群并持久化存储
    在Kubernetes中部署MySQL集群并持久化存储,可以使用StatefulSet和PersistentVolumeClaim(...
    99+
    2023-09-14
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作