数据持久化的两种方式:(1)基于终端指令的持久化存储;(2)基于管道的持久化存储

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

  在爬虫文件的parse方法中必须要return可迭代对象类型(通常为列表或字典等)的返回值,该返回值作为基于终端指令持久化指定文件的输出内容。

执行输出指定格式进行存储-------将爬取到的数据写入不同格式的文件中进行存储,存储格式有限:
scrapy crawl 爬虫文件 -o xxx.json
scrapy crawl 爬虫文件 -o xxx.xml
scrapy crawl 爬虫文件 -o xxx.csv

基于管道的持久化存储

  (1)编写爬虫文件进行数据解析

  (2)在items.py中定义相关字段(用于存储解析的数据)

  (3)在爬虫文件中将解析到的数据封装在实例化的item对象中

  (4)通过yield将item对象提交到pipelines.py中的管道

  (5)在管道中进行任意方式的数据持久化(数据库持久化需要重写两个方法open_spider和close_spider)

  (6)在settings.py配置文件中开启管道(ITEM_PIPELINES ,同时处理ROBOTSTXT_OBEY协议、USER_AGENT 伪装和LOG_LEVEL='ERROR'日志输出等级)

  (7)启动爬虫:scrapy crawl  爬虫文件

百度首页超链接数据解析与持久化存储

  1.编写爬虫文件firstPro.py   

 # -*- coding: utf-8 -*-
import scrapy
from firstPro.items import FirstproItem class FirstbaiduSpider(scrapy.Spider):
name = 'firstBaidu' # 爬虫文件(应用)名
# allowed_domains = ['https://www.baidu.com/']#域名限定,一般直接注释
start_urls = ['https://www.baidu.com//'] # 起始url,创建应用时指定的,可修改 def parse(self, response): # 自动访问起始URL并获取结果后的回调函数,参数respons为起始请求的响应对象,可以直接调用封装好的xpath解析 # print(response.text)#获取字符串类型的响应内容
# print(response.body)#获取字节类型的相应内容 # 进行数据解析
a_list = response.xpath('//p[@id="nv"]/a') # 注意页面解析标签定位!!!浏览器看到的标签位置和实际爬去的页面内容位置可能不一样
for a in a_list:
# scrapy自带xpath解析获取文本或属性需要使用extract()或extract_first()
title = a.xpath('./text()').extract_first().replace('\xa0','') # extract_first()从结果列表获取第一个值
url = a.xpath('./@href')[0].extract() # extract()从解析结果中取出所有制,结果只有一个就是字符串,多个就是列表
# print(title, url) # 解析后的数据需要进行持久化存储:
# (1)items.py中定义相关存储字段;
item = FirstproItem()
# (2)实例化item对象将解析的数据进行封装;
item['title'] = title
item['url'] = url
# (3)使用yield将item对象提交给管道处理
yield item pass

爬虫文件firstPro.py

  2.自定义items.py中的类字段

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

 # Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html import scrapy class FirstproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title=scrapy.Field()#存储标题
url=scrapy.Field()#存储连接
pass

items.py中类字段定义

  3.管道pipilines.py处理类定义

注意:
(1)要想使用管道进行数据持久化,必须在settings.py中进行开启配置;
(2)可以定义多个管道类进行处理,但是在每个process_item函数中必须return item 传递给其它管道使用;
(3)process_item参数item只接受爬虫文件提交来的item对象,参数spider是爬虫文件中类的实例化对象,可以进行数据传递;
(4)如果要对数九持久化写入到数据库,需要在管道类中重写open_spider和close_spider方法,这两个方法只会被执行一次;
(5)对于图片类(视频、音频等二进制)数据的下载有可以定义新的管道继承相关类既可以直接实现图片的下载,注意要在settings.py中指定存储路径IMAGES_STORE=path
 # 注意:
# (1)要想使用管道进行数据持久化,必须在settings.py中进行开启配置
# (2)可以定义多个管道类进行处理,但是在每个process_item函数中必须return item 传递给其它管道使用
# (3)process_item参数item只接受爬虫文件提交来的item对象,参数spider是爬虫文件中类的实例化对象,可以进行数据传递;
# (4)如果要对数九持久化写入到数据库,需要在管道类中重写open_spider和close_spider方法,这两个方法只会被执行一次;
# (5)对于图片类(视频、音频等二进制)数据的下载有可以定义新的管道继承相关类既可以直接实现图片的下载 # 默认管道处理
class FirstproPipeline(object):
# item对象处理函数
def process_item(self, item, spider):
print(item)
return item

管道处理注意事项

 # (1)自定义的文件持久化管道
class TofilePipeline(object):
# 构造方法初始化一个属性文件句柄,也可以定义一个类变量:fp=None
def __init__(self):
self.fp = None # 打开文件句柄
def open_spider(self, spider):
print('开始写入数据...')
self.fp = open('a.text', 'w', encoding='utf-8') # 关闭文件进行系统资源回收
def close_spider(self, spider):
self.fp.close()
print('数据下载成功,爬虫结束!') def process_item(self, item, spider):
self.fp.write(f'{item["title"]}:{item["url"]}\n')
return item

(1)自定义的文件持久化管道

 # (2)自定义的基于mysql数据库持久化管道
import pymysql
class ToMysqlPipeline(object):
conn = None
cursor = None # 建立数据库连接
def open_spider(self, spider):
print('建立数据库连接...')
self.conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='spider') # 关闭数据库连接
def close_spider(self, spider):
self.cursor.close() # conn断开时也会自动断开
self.conn.close()
print('成功写入数据库!') def process_item(self, item, spider):
sql = f'insert into table1 values ({item["title"]},{item["url"]})'
self.cursor = self.conn.cursor() # 数据库事务操作
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback() return item

(2)自定义的基于mysql数据库持久化管道

 # (3)自定义的基于redis数据库持久化管道
import redis
class ToRedisPipeline(object):
conn = None # 建立数据库连接
def open_spider(self, spider):
print('建立数据库连接...')
self.conn = redis.Redis(host='127.0.0.1', port=6379) def process_item(self, item, spider):
self.conn.lpush('data', dict(item)) # 将item对象以字典形式存储在redis列表结构中
return item

(3)自定义的基于redis数据库持久化管道

 # (4)自定义的基于mongodb数据库持久化管道
import pymongo
class ToMongoDBPipeline(object):
conn = None # 建立数据库连接
def open_spider(self, spider):
print('建立数据库连接...')
self.conn = pymongo.MongoClient(host='127.0.0.1', port=27017) # 关闭数据库连接(可以不写)
def close_spider(self, spider):
self.conn.close()
print('成功写入数据库!') def process_item(self, item, spider):
self.conn.Spider.col.insert_one({item["title"]:item["url"]}) #将title:url存入mongodb的Spider数据库中col集合(表)中
return item

(4)自定义的基于MongoDB数据库持久化管道

 # (5)自定义图片等文件的下载管道
#IMAGES_STORE='filepath'在settings设置文件中指定存储图片的下载路径
import os
import scrapy
from scrapy.pipelines.images import ImagesPipeline class ImageDownloadPipeline(ImagesPipeline):
#接收item且将item中存储的url进行请求发送
def get_media_requests(self, item, info): # 下载图片
url=item["url"]
yield scrapy.Request(url, meta={'item': item}) # 指定下载路径
def file_path(self, request, response=None, info=None):
item = request.meta['item']
img_name = request.url.split('/')[-1]
path='图片'#自动会创建文件夹,同时存放在settings.py中指定的IMAGES_STORE配置路径下
filename = os.path.join(path, img_name)
print(f'正在下载------{filename}...')
return filename # 将item传递给下一个即将被执行的管道类
def item_completed(self, result, item, info):
return item

(5)自定义图片等文件的下载管道

  4.settings.py配置文件

 # Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'firstPro (+http://www.yourdomain.com)'
# (1)UA伪造
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' # Obey robots.txt rules
# ROBOTSTXT_OBEY = True
# (2)不遵守robots协议
ROBOTSTXT_OBEY = False # (3)设置日志输出等级
LOG_LEVEL = 'ERROR' # Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 取消注释,开启管道,数字代表优先级,越小级别越高,按需要开启
ITEM_PIPELINES = {
'firstPro.pipelines.FirstproPipeline': 300,
'firstPro.pipelines.TofilePipeline': 200,
# 'firstPro.pipelines.ToMysqlPipeline': 600,
'firstPro.pipelines.ToRedisPipeline': 100,
# 'firstPro.pipelines.ToMongoDBPipeline': 400,
# 'firstPro.pipelines.ImageDownloadPipeline': 200,
} #如果开启图片下载管道,需要指定下载目录
# IMAGES_STORE='./images'

  5.启动爬虫程序  

scrapy crawl firstPro

scrapy实现数据持久化、数据库连接、图片文件下载及settings.py配置的更多相关文章

  1. Docker namespace,cgroup,镜像构建,数据持久化及Harbor安装、高可用配置

    1.Docker namespace 1.1 namespace介绍 namespace是Linux提供的用于分离进程树.网络接口.挂载点以及进程间通信等资源的方法.可以使运行在同一台机器上的不同服务 ...

  2. 论Scrapy中的数据持久化

    引入 Scrapy的数据持久化,主要包括存储到数据库.文件以及内置数据存储. 那我们今天就来讲讲如何把Scrapy中的数据存储到数据库和文件当中. 终端指令存储 保证爬虫文件的parse方法中有可迭代 ...

  3. Scrapy 框架,持久化文件相关

    持久化相关 相关文件 items.py 数据结构模板文件.定义数据属性. pipelines.py 管道文件.接收数据(items),进行持久化操作. 持久化流程 1.爬虫文件爬取到数据后,需要将数据 ...

  4. scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium

    今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...

  5. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  6. 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...

  7. scrapy 学习笔记2 数据持久化

    前情提要:校花网爬取,并进行数据持久化 数据持久化操作 --编码流程: 1:数据解析 2:封装item 类 3: 将解析的数据存储到实例化好的item 对象中 4:提交item 5:管道接收item然 ...

  8. iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)

    本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...

  9. scrapy框架的持久化存储

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

随机推荐

  1. 2019-2020-1 20199326《Linux内核原理与分析》第七周作业

    实验内容:分析Linux内核创建一个新进程的过程 初始化Menu Os,输入fork可以看到menuos触发了一个fork系统调用 再开一个shell,进入调试模式,设置几个断点sys_clone,d ...

  2. [Inno Setup] 开机自启动

    [icons] Name: "{userstartup}\My Program"; Filename: "{app}\MyProg.exe"; Tasks:St ...

  3. POJ1475 推箱子---模块化思想

    自古逢秋悲寂寥,我言秋日胜春朝. 晴空一鹤排云上,便引诗情到碧霄. --刘禹锡 题目:推箱子 网址:http://poj.org/problem?id=1475 推箱子游戏相信大家都不陌生,在本题中, ...

  4. mpvue开发微信小程序之时间+日期选择器

    最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...

  5. 算法竞赛进阶指南--快速幂,求a^b mod p

    // 快速幂,求a^b mod p int power(int a, int b, int p) { int ans = 1; for (; b; b >>= 1) { if (b &am ...

  6. 数据库SQL语言从入门到精通--Part 1--SQL语言概述

    数据库从入门到精通合集(超详细,学习数据库必看) 一.SQL概述 关系数据库标准语言SQL(结构化查询语言). 结构化查询语言(Structured Query Language)简称SQL,是一种特 ...

  7. P5057 【[CQOI2006]简单题】

    洛谷P5057[CQOI2006]简单题 差分 树状数组基本操作不说了,主要想记录一下异或下的差分 a数组为每一位的真实值(假设\(a[0]=0\)),t为差分后的数组 则\(t[i]=a[i]\)^ ...

  8. python(time 模块)

    一.Time 模块 1.时间戳 时间戳是指格林威治时间 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒) 起至现在的总秒数 最早出现的 UNIX 操作系统考 ...

  9. DNS 处理模块 dnspython

    简介: dnspython (http://www.dnspython.org/)是Python实现一个DNS的工具包,支持所有的记录类型,可以用于查询.传输并动态更新ZONE信息. 安装 wget ...

  10. 题目分享C 二代目

    题意:一个数列是由 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6.....组成,也就是1-1,1-2,1-3......并且如果遇到多位数也要拆成数字比如1-10 ...