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

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

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

  1. scrapy crawl 爬虫名称 -o xxx.json
  2. scrapy crawl 爬虫名称 -o xxx.xml
  3. scrapy crawl 爬虫名称 -o xxx.csv

基于管道的持久化存储

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

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

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

持久化流程:

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

settings.py文件中开启管道:

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

终端持久化存储示例:

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

爬虫程序

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3.  
  4. class QiubaiSpider(scrapy.Spider):
  5. name = 'qiubai'
  6. # allowed_domains = ['www.qiushibaike.com']
  7. start_urls = ['https://www.qiushibaike.com/text/']
  8.  
  9. def parse(self, response):
  10. div_list = response.xpath('//div[@id="content-left"]/div')
  11. all_data = []
  12. # xpath返回的列表元素类型为Selector类型
  13. for div in div_list:
  14. # title = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()')[0].extract()
  15. author = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()').extract_first()
  16. content = div.xpath('./a[1]/div/span/text()').extract_first()
  17.  
  18. dic = {
  19. 'author': author,
  20. 'content': content
  21. }
  22.  
  23. all_data.append(dic)
  24. # 基于终端指令的持久化存储:可以通过终端指令的形式将parse方法的返回值中存储的数据进行本地磁盘的持久化存储
  25. return all_data

settings

  1. BOT_NAME = 'qiubaiPro'
  2. 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'
  3. SPIDER_MODULES = ['qiubaiPro.spiders']
  4. NEWSPIDER_MODULE = 'qiubaiPro.spiders'
  5. ROBOTSTXT_OBEY = False

执行:

  1. scrapy crawl qiubai -o qiubai.csv

执行完之后的结果:

管道持久化存储示例:

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

爬虫程序

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from bossPro.items import BossproItem
  4.  
  5. class BossSpider(scrapy.Spider):
  6. name = 'boss'
  7. allowed_domains = ['www.xxx.com']
  8. start_urls = ['https://www.zhipin.com/job_detail/?query=Python爬虫&scity=101010100&industry=&position=']
  9.  
  10. def parse(self, response):
  11. li_list = response.xpath('//div[@class="job-list"]/ul/li')
  12. for li in li_list:
  13. title = li.xpath('.//div[@class="info-primary"]/h3[@class="name"]/a/div/text()').extract_first()
  14. salary = li.xpath('.//div[@class="info-primary"]/h3[@class="name"]/a/span/text()').extract_first()
  15. company = li.xpath('.//div[@class="company-text"]/h3/a/text()').extract_first()
  16.  
  17. # 实例化一个item类型的对象
  18. item = BossproItem()
  19. # 将解析到的数据存储到item对象中
  20. item["title"] = title
  21. item["salary"] = salary
  22. item["company"] = company
  23.  
  24. # 将item对象提交给管道进行持久化存储
  25. yield item

items

  1. # -*- coding: utf-8 -*-
  2.  
  3. # Define here the models for your scraped items
  4. #
  5. # See documentation in:
  6. # https://doc.scrapy.org/en/latest/topics/items.html
  7.  
  8. import scrapy
  9.  
  10. class BossproItem(scrapy.Item):
  11. # define the fields for your item here like:
  12. # name = scrapy.Field()
  13. title = scrapy.Field()
  14. salary = scrapy.Field()
  15. company = scrapy.Field()

pipelines

  1. # -*- coding: utf-8 -*-
  2.  
  3. # Define your item pipelines here
  4. #
  5. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  6. # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
  7.  
  8. # 管道文件:需要接收爬虫文件提交过来的数据,并对数据进行持久化存储.(IO操作)
  9. class BossproPipeline(object):
  10. fp = None
  11. # 只会被执行一次(开始爬虫的时候执行一次)
  12. def open_spider(self,spider):
  13. print("开始爬虫")
  14. self.fp = open('./job.txt','w',encoding='utf-8')
  15. # 爬虫文件每提交一次,该方法就会被调用一次
  16. def process_item(self, item, spider): #300表示为优先级,值越小优先级越高
  17. self.fp.write(item['title'] + "\t" + item['salary'] + '\t' + item['company'] + '\n')
  18. return item
  19. # 结束爬虫时执行
  20. def close_spider(self,spider):
  21. self.fp.close()
  22. print("爬虫结束")
  23.  
  24. # 注意:默认情况下,管道机制并没有开启,需要手动在配置文件中进行开启
  25.  
  26. # 使用管道进行持久化的流程:
  27. # 1.获取解析到的数据
  28. # 2.将解析的数据存储到item对象(item类中进行相关属性的声明)
  29. # 3.通过yield关键字将item提交到管道
  30. # 4.管道文件中进行持久化存储代码的编写(process_item)
  31. # 5.在配置文件中开启管道

settings

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

执行:

  1. scrapy crawl boss --nolog

基于MySQL的持久化存储

pipelines

  1. import pymysql
  2. class mysqlPipeline(object):
  3. conn = None
  4. cursor = None
  5. def open_spider(self,spider):
  6. self.conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='', db='spider')
  7. print(self.conn)
  8. def process_item(self, item, spider):
  9. self.cursor = self.conn.cursor()
  10. sql = 'insert into boss values("%s","%s","%s")'%(item['title'],item['salary'],item['company'])
  11. try:
  12. self.cursor.execute(sql)
  13. self.conn.commit()
  14. except Exception as e:
  15. print (e)
  16. self.conn.rollback()
  17.  
  18. def close_spider(self,spider):
  19. self.cursor.close()
  20. self.conn.close()

settings

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

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

基于redis管道存储

 pipelines

  1. from redis import Redis
  2. class RedisPipeline(object):
  3. conn = None
  4. def process_item(self,item,spider):
  5. dic = {
  6. "title":item["title"],
  7. "salary":item["salary"],
  8. "company":item["company"]
  9. }
  10. self.conn.lpush("jobInfo",json.dumps(dic))
  11. def open_spider(self,spider):
  12. self.conn = Redis(host='127.0.0.1',port=6379)
  13. print (self.conn)

settings

  1. ITEM_PIPELINES = {
  2. #'bossPro.pipelines.BossproPipeline': 300,
  3. #'bossPro.pipelines.mysqlPipeline': 301,
  4. 'bossPro.pipelines.RedisPipeline': 302,
  5. }

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

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

Scrapy持久化存储的更多相关文章

  1. Scrapy持久化存储-爬取数据转义

    Scrapy持久化存储 爬虫爬取数据转义问题 使用这种格式,会自动帮我们转义 'insert into wen values(%s,%s)',(item['title'],item['content' ...

  2. scrapy之持久化存储

    scrapy之持久化存储 scrapy持久化存储一般有三种,分别是基于终端指令保存到磁盘本地,存储到MySQL,以及存储到Redis. 基于终端指令的持久化存储 scrapy crawl xxoo - ...

  3. scrapy 爬虫框架之持久化存储

    scrapy  持久化存储 一.主要过程: 以爬取校花网为例 : http://www.xiaohuar.com/hua/ 1.  spider    回调函数     返回item 时    要用y ...

  4. 11.scrapy框架持久化存储

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  5. scrapy框架持久化存储

    基于终端指令的持久化存储 基于管道的持久化存储 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文 ...

  6. scrapy框架的持久化存储

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

  7. 爬虫--使用scrapy爬取糗事百科并在txt文件中持久化存储

    工程目录结构 spiders下的first源码 # -*- coding: utf- -*- import scrapy from firstBlood.items import Firstblood ...

  8. 11,scrapy框架持久化存储

    今日总结 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  9. scrapy 框架持久化存储

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

随机推荐

  1. tail 尾巴

    tail用法:尾巴,取文件的最后N行,默认前10行, -n 2 取前2行-n 2,简写就是-2 -f 文件 跟踪一个文件尾部的时时变化. 克隆出一个窗口执行:循环脚本:for n in `seq 1 ...

  2. python的学习之路day5

    大纲: 1.双层装饰器 单层装饰器 双层装饰器 原理 2.字符串的格式化 3.format字符串格式化 4.生成器 5.递归 6.模块的安装 7.json模块 8.pickle模块 9.time模块 ...

  3. OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)

    http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...

  4. 微信支付回调,XXE攻击漏洞防止方法

    最近微信支付回调发现的XXE攻击漏洞(什么是XXE攻击,度娘.bing去搜,一搜一大把),收到通知后即检查代码, 微信给的解决方法是如果你使用的是: XmlDocument: XmlDocument ...

  5. Dalvik指令备忘

    跳转指令 if-eq vx, vy, 目标 如果vx == vy注2,跳转到目标.if-ne vx,vy, 目标 如果vx != vy注2,跳转到目标. if-lt vx,vy, 目标 如果vx &l ...

  6. 【python】关于python中模块导入的总结

    precondition:比如我有如下这样的文件目录结构 说明:add和debug两个包都隶属于src目录,它们是同级目录,其中在add路径下有一个add.py的模块,里面定义了一个jiafa()的函 ...

  7. 类与对象 - Java学习(二)

    弄清楚类与对象的本质与基本特征,是进一步学习面向对象编程语言的基本要求.面向对象程序设计与面向过程程序设计在思维上存在着很大差别,改变一种思维方式并不是一件容易的事情. 一.面向对象程序设计 程序由对 ...

  8. Math.min() / Math.max() 使用方法

    首先弄懂apply 和 call 都是js函数自带的方法.区别如下: apply和call的用法只有一个地方不一样,除此之外,其他地方基本一模一样 1. a.call(b,arg1,arg2…) 2. ...

  9. BZOJ4300:绝世好题(DP)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  10. WCF错误:413 Request Entity Too Large 的一个解决方法

    在我们用WCF传输数据的时候,如果启用默认配置,传输的数据量过大,经常会出这个WCF:413 Request Entity Too Large的错误. WCF包含服务端与客户端,所以这个错误可能出现在 ...