【Python爬虫】:Scrapy数据持久化

要想将我们爬取到的文件的数据进行持久化操作,那么在Scrapy下有两种方式,

1.基于终端指令的数据持久化

要求:只能将parse方法的返回值储存到文本文件当中

注意:持久化文本文件的类型只能够为csv,json.xml等,不能够为txt,excel

指令使用:

scrapy crawl xxx(爬虫文件名) -o xxx.csv(保存的文件名)

好处:十分简洁且高效便捷

缺点:局限性比较强,只能够保存为指定后缀

2.基于管道的数据持久化:

管道持久化的流程:

编码流程:

1.数据解析

2.在item当中定义我们需要储存的数据的属性

3.将解析的对象封装到Item类型的对象

4.将item类型的对象交给管道,进行数据持久化的操作

5.在管道类Pipline当中的process_item当中进行数据持久化代码的编写

6.在配置文件当中开启管道

进行数据解析和爬取:

import scrapy
from firstBlood.items import FirstbloodItem
class FirstSpider(scrapy.Spider):
#爬虫文件的名称:爬虫源文件的一个唯一标识
name = 'first'
#允许的域名:用来限定start_urls列表中哪些url可以进行请求发送
#allowed_domains = ['www.baidu.com']
#起始的url列表:该列表当中存放的url会被scrapy自动发送请求
start_urls = ['https://www.qiushibaike.com/text/']
#用来进行数据解析的:response参数标的是请求成功后对应的响应对象
def parse(self, response):
#start_urls里面有多少个url。就调用这个方法多少次
author=response.xpath('//div[@id="content"]//h2/text()').extract()
content=response.xpath('//div[@id="content"]//div[@class="content"]/span/text()').extract()
#item只能够一组一组的解析,不能够把全部的数据一次全部加载进去
item = FirstbloodItem()
for i in author:
print(i)
item['author']=i
break
for i in content:
item['content']=i
print(i)
break
yield item
用yield提交我们所得到的item数据一次
因此我们首先编写item.py文件,标注我们需要进行储存的文件,item.py文件如下所示:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class FirstbloodItem(scrapy.Item):
# define the fields for your item here like:
author= scrapy.Field()
content=scrapy.Field()

在pipelines.py文件里重写open_spider和close_spider方法,同时在process_item里提取出数据,将数据写入到txt文件里,因此编写代码:

class FirstbloodPipeline:
fp=None
#开始爬虫时,调用一次
def open_spider(self,spider):
print("开始爬虫")
self.fp=open('./result.txt','w',encoding='utf-8')
# 该方法每接受到一次item就会被调用一次
def process_item(self, item, spider):
#取出数据
author=item['author']
content=item['content']
self.fp.write(author+": "+content+"\n")
return item
#结束爬虫时,调用一次
def close_spider(self,spider):
print("结束爬虫!")
self.fp.close()

在settings文件里开启管道,优先级设定为默认的300,数值越小,说明优先级越大:

ITEM_PIPELINES = {

'firstBlood.pipelines.FirstbloodPipeline': 300,

#300表示的是优先级,数值越小,则优先级越高

}

最后的运行结果:

【Python爬虫】:Scrapy数据持久化 相关文章

03 python控制语句和赋值语句

1、基本语句 1.1、input获取用户输入 varname=input(“提示信息”) input默认输入的值都是字符串。 type()查看数据类型。 int()强制转换为整型。 python2中的raw_input和python3中的input相同(python2中input不建议使用)。 name=input("名字:")age=int(inp

【python】python之list

1.判断list是否为空 方式一: list_temp=[]if len(list_temp): #非空即为真 print('list is not empty')else: print('list is empty') 方式二: list_temp=[]if list_temp: #非空即为真 print('list is not empty')else: print('list is empty') 总结:推荐

针对Python基本数据类型的操作

在学习Python语法前,请大家务必注意,Python是通过缩进来定义代码层次的,即同一层次的代码都是左对齐,而下个层次的代码块与当前代码块相比,会有4个空格的缩进。 这里缩进的空格数是约定俗成的,当然如果缩进空格数是3或者5,语法上不会有问题,但这样会

re模块

python学习-re模块 预备知识 正则表达式基本语法 '''^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa+ 匹配前面元字符1次或多

(数据科学学习手札106)Python+Dash快速web应用开发——回调交互篇(下)

本文示例代码已上传至我的 Github 仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程 Python+Dash快速web应用开发 的第五期,在上一期的文章中,我们针对 Dash 中有关回调的一些技巧性的特性进行了介绍,使得我们可以更愉快

scrapy中发送post请求

1、可以使用`yield scrapy.FormRequest(url,formdata,callback)`方法发送POST请求。 其中构造参数formdata可以是字典,也可以是可迭代的(key,value)元组,代表着需要提交的表单数据。 2、如果希望程序执行一开始就发送POST请求,可以重写Spider类的`start_

python3.8 from aip improt AipBodyAnalysis报错 cannot import name AipBodyAnalysis

from aip import AipBodyAnalysis报错 cannot import name AipBodyAnalysis 我使用的python3.8 # -*- coding: utf-8 -*-from aip import __init__from aip import AipBodyAnalysis 报错如下: 在网上搜索看到大家在使用这个命令的时候没有问题啊,那么我的问

Python爬取某平台短视频,把你喜欢的视频下收藏起来

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 基本开发环境 Python 3.6 Pycharm 相关模块的使用 import osimport requests 安装Python并添加到环境变量,pip安装需要的相关模块即可。 一、确定

【2021.02.07】macOS配置python3环境

macOS是自带python环境的,现在要做的是配置python3的环境 (这个退出实在让我难受,以前在window上都是 ctrl+z 退出的,这里用的是 command+z 退出,差点找不到退出方法XD 安装python3 访问官网:https://www.python.org/downloads/mac-osx/ 下载最新版本,

python笔记 对比式学习

适合java、js都学过的 学习视频 https://www.bilibili.com/video/BV12E411A7ZQp=5 -常用 1、计算长度使用len(值) 2、在字符串前加r可以忽略字符串内的转义字符 3、区间范围为左闭右开,包含左边不包含右边 -判断 1、else if为elif 2、while可以衔接else 3、