scrapy实现数据持久化、数据库连接、图片文件下载及settings.py配置
数据持久化的两种方式:(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配置的更多相关文章
- Docker namespace,cgroup,镜像构建,数据持久化及Harbor安装、高可用配置
1.Docker namespace 1.1 namespace介绍 namespace是Linux提供的用于分离进程树.网络接口.挂载点以及进程间通信等资源的方法.可以使运行在同一台机器上的不同服务 ...
- 论Scrapy中的数据持久化
引入 Scrapy的数据持久化,主要包括存储到数据库.文件以及内置数据存储. 那我们今天就来讲讲如何把Scrapy中的数据存储到数据库和文件当中. 终端指令存储 保证爬虫文件的parse方法中有可迭代 ...
- Scrapy 框架,持久化文件相关
持久化相关 相关文件 items.py 数据结构模板文件.定义数据属性. pipelines.py 管道文件.接收数据(items),进行持久化操作. 持久化流程 1.爬虫文件爬取到数据后,需要将数据 ...
- scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium
今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...
- 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中
第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...
- 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中
前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...
- scrapy 学习笔记2 数据持久化
前情提要:校花网爬取,并进行数据持久化 数据持久化操作 --编码流程: 1:数据解析 2:封装item 类 3: 将解析的数据存储到实例化好的item 对象中 4:提交item 5:管道接收item然 ...
- iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)
本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...
- scrapy框架的持久化存储
一 . 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存 ...
随机推荐
- 关于virtualbox配置centos7的网络问题
连接方式最好选桥接网卡 原文:https://www.cnblogs.com/zergling9999/p/6026006.html
- php内置函数call_user_func()
<?php //call_user_func(callback,name,age) //第一个参数callback作为回掉函数使用,其余的参数是他的参数 function now($a,$b) ...
- VulnHub靶场学习_HA: Chanakya
HA-Chanakya Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-chanakya,395/ 背景: 摧毁王国的策划者又回来了,这次他创造了一个难 ...
- javascript SDK开发之webpack中eslint的配置
eslint的好处就不多说了.代码检查,代码报错, 智能提示,让开发人员更规范的撸代码等等. 1.安装依赖 npm install --save-dev eslint eslint-friendly- ...
- MySQL分页查询的性能优化
MySQL limit分页查询的性能优化 Mysql的分页查询十分简单,但是当数据量大的时候一般的分页就吃不消了. 传统分页查询:SELECT c1,c2,cn… FROM table LIMIT n ...
- #Week7 Neural Networks : Learning
一.Cost Function and Backpropagation 神经网络的损失函数: \[J(\Theta) = - \frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K ...
- codeforces 1287A -Angry Students(模拟)
It's a walking tour day in SIS.Winter, so t groups of students are visiting Torzhok. Streets of Torz ...
- P1458 顺序的分数 Ordered Fractions(有技巧的枚举)+C++类封装=精简代码
题目描述 输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数. 这有一个例子,当N=5时,所有解 ...
- 51 NOD 1049 最大子段和 动态规划 模板 板子 DP
N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0. 例如:-2,11,-4,13,-5,- ...
- 内存淘汰机制——LRU与LFU
内存淘汰机制之LRU与LFU LRU(Least Recently Used):淘汰 近期最不会访问的数据 LFU(Least Frequently Used):淘汰 最不经常使用(访问次数少) 所谓 ...