第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

注意:数据保存的操作都是在pipelines.py文件里操作的

将数据保存为json文件

spider是一个信号检测

  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: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  7. from scrapy.pipelines.images import ImagesPipeline #导入图片下载器模块
  8. import codecs
  9. import json
  10.  
  11. class AdcPipeline(object): #定义数据处理类,必须继承object
  12. def __init__(self):
  13. self.file = codecs.open('shuju.json', 'w', encoding='utf-8') #初始化时打开json文件
  14. def process_item(self, item, spider): #process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象
  15. # print('文章标题是:' + item['title'][0])
  16. # print('文章缩略图url是:' + item['img'][0])
  17. # print('文章缩略图保存路径是:' + item['img_tplj']) #接收图片下载器填充的,图片下载后的路径
  18.  
  19. #将数据保存为json文件
  20. lines = json.dumps(dict(item), ensure_ascii=False) + '\n' #将数据对象转换成json格式
  21. self.file.write(lines) #将json格式数据写入文件
  22. return item
  23. def spider_closed(self,spider): #创建一个方法继承spider,spider是一个信号,当前数据操作完成后触发这个方法
  24. self.file.close() #关闭打开文件
  25.  
  26. class imgPipeline(ImagesPipeline): #自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类
  27. def item_completed(self, results, item, info): #使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径
  28. for ok, value in results:
  29. img_lj = value['path'] #接收图片保存路径
  30. # print(ok)
  31. item['img_tplj'] = img_lj #将图片保存路径填充到items.py里的字段里
  32. return item #将item给items.py 文件的容器函数
  33.  
  34. #注意:自定义图片下载器设置好后,需要在

将数据保存到数据库

我们使用一个ORM框架sqlalchemy模块,保存数据

数据库操作文件

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from sqlalchemy import Column
  6. from sqlalchemy import Integer, String, TIMESTAMP
  7. from sqlalchemy import ForeignKey, UniqueConstraint, Index
  8. from sqlalchemy.orm import sessionmaker, relationship
  9. from sqlalchemy import create_engine
  10.  
  11. #配置数据库引擎信息
  12. ENGINE = create_engine("mysql+pymysql://root:279819@127.0.0.1:3306/cshi?charset=utf8", max_overflow=10, echo=True)
  13.  
  14. Base = declarative_base() #创建一个SQLORM基类
  15.  
  16. class SendMsg(Base): #设计表
  17. __tablename__ = 'sendmsg'
  18.  
  19. id = Column(Integer, primary_key=True, autoincrement=True)
  20. title = Column(String(300))
  21. img_tplj = Column(String(300))
  22.  
  23. def init_db():
  24. Base.metadata.create_all(ENGINE) #向数据库创建指定表
  25.  
  26. def drop_db():
  27. Base.metadata.drop_all(ENGINE) #向数据库删除指定表
  28.  
  29. def session():
  30. cls = sessionmaker(bind=ENGINE) #创建sessionmaker类,操作表
  31. return cls()
  32.  
  33. # drop_db() #删除表
  34. # init_db() #创建表

pipelines.py文件

  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: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  7. from scrapy.pipelines.images import ImagesPipeline #导入图片下载器模块
  8. from adc import shujuku as ORM #导入数据库文件
  9.  
  10. class AdcPipeline(object): #定义数据处理类,必须继承object
  11. def __init__(self):
  12. ORM.init_db() #创建数据库表
  13. def process_item(self, item, spider): #process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象
  14. print('文章标题是:' + item['title'][0])
  15. print('文章缩略图url是:' + item['img'][0])
  16. print('文章缩略图保存路径是:' + item['img_tplj']) #接收图片下载器填充的,图片下载后的路径
  17.  
  18. mysq = ORM.session()
  19. shuju = ORM.SendMsg(title=item['title'][0], img_tplj=item['img_tplj'])
  20. mysq.add(shuju)
  21. mysq.commit()
  22. return item
  23.  
  24. class imgPipeline(ImagesPipeline): #自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类
  25. def item_completed(self, results, item, info): #使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径
  26. for ok, value in results:
  27. img_lj = value['path'] #接收图片保存路径
  28. # print(ok)
  29. item['img_tplj'] = img_lj #将图片保存路径填充到items.py里的字段里
  30. return item #将item给items.py 文件的容器函数
  31.  
  32. #注意:自定义图片下载器设置好后,需要在

第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存的更多相关文章

  1. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  2. 二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

    注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your ite ...

  3. 二十四 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

  4. 第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目

    第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目 scrapyd模块是专门用于部署scrapy项目的,可以部署和管理scrapy项目 下载地址:h ...

  5. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  6. 第三百五十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—chrome谷歌浏览器无界面运行、scrapy-splash、splinter

    第三百五十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—chrome谷歌浏览器无界面运行.scrapy-splash. splinter 1.chrome谷歌浏览器无界面运行 chrome ...

  7. 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制

    第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...

  8. 第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP

    第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP 设置代理ip只需要,自定义一个中间件,重写process_request方法, request ...

  9. 第三百四十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理

    第三百四十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware随机更换user-agent浏览器用户代理 downloadmiddleware介绍中间件是 ...

随机推荐

  1. FFmpeg(11)-基于FFmpeg进行音频重采样(swr_init(), swr_convert())

    一.包含头文件和库文件 修改CMakeLists # swresample add_library(swresample SHARED IMPORTED) set_target_properties( ...

  2. linux怎么关闭iptables linux如何关闭防火墙

    Linux系统下面自带了防火墙iptables,iptables可以设置很多安全规则.但是如果配置错误很容易导致各种网络问题,那么如果要关闭禁用防火墙怎么操作呢,咗嚛本经验以centos系统为例演示如 ...

  3. 服务器搭建3 安装libevent2.0.20

    1.检测是否安装 安装了的话应该是这样的:如果不是,那就装一下. root@iZ23nyl8frqZ:/home/upload# ls -a /usr/lib |grep libeventlibeve ...

  4. 【编码】Base64编码

    简述 为什么叫Base64?个人理解是,基础的64个字符. 而它的作用?用基础的(可理解为可安全传输的)64个字符,来表示难以表示的二进制或对程序造成干扰的字符. Base64的编码过程 自行编码分析 ...

  5. crontab入门

    参数 crontab是一个处理定时任务的命令,在终端输入man crontab可以得到使用方法提示,主要参数如下: crontab -u # 指定运行的账户,默认为当前账户 crontab -l # ...

  6. 针对后台TCP服务F5健康检查配置

    1.TCP-HALF-OPEN方式 TCP-HALF-OPEN的探测方式,实际是F5每隔一个固定的时间,发送一个SYN包给资源池pool中的一个member,等待服务器返回SYN_ACK,在收到SYN ...

  7. Android开发(四)——Android中的颜色

    Android开发中关于资源文件的存储操作.对于Android资源也是非常重要的,主要包括文本字符串(strings).颜色(colors).数组(arrays).动画(anim).布局(layout ...

  8. [转]javaweb学习总结(二十九)——EL表达式

    原文地址:https://www.cnblogs.com/xdp-gacl/p/3938361.html 一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获 ...

  9. cas单点登录-jdbc认证(三)

    前言 本节的内容为JDBC认证,查找数据库进行验证,其中包括: 密码加密策略(无密码,简单加密,加盐处理) 认证策略(jdbc) 一.业务需求 不同的公司,需求业务需求或者架构不一样导致我们实现验证的 ...

  10. 依赖注入(Dependency Injection)

    Spring的两个核心内容为控制反转(Ioc)和面向切面(AOP),依赖注入(DI)是控制反转(Ioc)的一种方式. 依赖注入这个词让人望而生畏,现在已经演变成一项复杂的编程技巧 或设计模式理念.但事 ...