python爬虫基于管道持久化存储操作

文章目录

  • 基于管道持久化存储操作
  • scrapy的使用步骤
    • 1.先转到想创建工程的目录下:cd ...
    • 2.创建一个工程
    • 3.创建之后要转到工程目录下
    • 4.在spiders子目录中创建一个爬虫文件
    • 5.执行工程
    • setting文件中的参数
  • 基于管道持久化存储的步骤:
  • 持久化存储1:保存到本地txt文档。
      • 1. 数据解析
      • 2. 在item类中定义相关的属性
      • 3. 将解析的数据封装存储到item类型的对象
      • 4. 将item类型的对象提交给管道进行持久化存储的操作
      • 5. 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
      • 6. 在配置文件中开启管道
      • 运行结果:
  • 持久化存储2:保存到数据库中。
      • 前言
        • 安装mysql
        • 安装navicat
        • 使用终端操作数据库
        • 如何使用navicat新建数据库&新建表
      • 1234步与持久化存储1完全相同。
      • 5. 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
      • 6. 在配置文件中开启管道
      • 运行结果
      • 后记:

基于管道持久化存储操作

这个也是在基于scrapy框架的基础上实现的,所以scrapy的基本使用命令也是需要遵从的

scrapy的使用步骤

1.先转到想创建工程的目录下:cd …

2.创建一个工程

scrapy startproject 工程名  (XXPro:XXproject)

3.创建之后要转到工程目录下

cd 工程名

4.在spiders子目录中创建一个爬虫文件

这里不需要切换目录,在项目目录下即可。
www.xxx.com是要爬取的网站。

scrapy genspider 爬虫文件名 www.xxx.com

5.执行工程

在pycharm中直接执行是不管用的,无效。应该再在终端中执行

scrapy crawl 爬虫文件名				# 执行的是爬虫文件

setting文件中的参数

项目下有一个settings文件,里面的文件介绍如下:

# Obey robots.txt rules
ROBOTSTXT_OBEY = False#显示指定类型的日志信息 而不显示其他乱七八糟的
LOG_LEVEL = 'ERROR'# 设置用户代理 浏览器类型
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"# 取消注释改行,意味着开启管道存储。
# 300表示优先级,数值越小优先级越高	
ITEM_PIPELINES = {"weiboPro.pipelines.WeiboproPipeline": 300,
}

基于管道持久化存储的步骤:

1. 数据解析
2. 在item类中定义相关的属性
3. 将解析的数据封装存储到item类型的对象
4. 将item类型的对象提交给管道进行持久化存储的操作
5. 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
6. 在配置文件中开启管道

持久化存储1:保存到本地txt文档。

这个并不是很难。主要是理清他的思路是什么。
在工程目录下的爬虫文件(这里是weibo.py)写好保证能够爬取到信息之后,主要是将管道文件写好(pipelines.py)。
按照上面的6步走:

1. 数据解析

即爬取数据的过程

# (weibo.py爬虫文件)
# 不使用数据库,只保存到本地import scrapy
from weiboPro.items import WeiboproItem
# 导包失败:右键项目目录 => 将目标标记为 => 源代码根目录# 爬取微博失败了,返回为空。改为爬取B站了。
# 爬取B站的视频的名称和作者
class WeiboSpider(scrapy.Spider):name = "weibo"# allowed_domains = ["weibo.com"]start_urls = ["https://www.bilibili.com/"]def parse(self, response):author = []title = []div_list = response.xpath('//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div')print("数据长度为", len(div_list))for div in div_list:# xpath返回的是列表,但是列表元素一定是Selector类型的对象# extract可以将Selector对象中data参数存储的字符串提取出来author = div.xpath('.//div[@class="bili-video-card__info--right"]//a/span[@class="bili-video-card__info--author"]/text()').extract()    # xpath要从上一层的xpath开始找,必须在最前面加个. !!# 对列表调用extract后,将列表的每一个Selector对象中的data对应的字符串提取了出来title=div.xpath('.//div[@class="bili-video-card__info--right"]/h3/a/text()').extract()# author, title解析到的为list,将其转为str# 将列表转为字符串: .join方法author = ''.join(author)title = ''.join(title)print('当前抽取的author', author)print('当前抽取的title', title)print(len(author), len(title))# 3,4两步都在循环内,所以是每执行一次循环将item对象提交给管道并存储到本地# 3.将解析的数据封装存储到item类型的对象item = WeiboproItem()item['author'] = authoritem['title'] = title# 4. 将item类型的对象提交给管道进行持久化存储的操作yield item

2. 在item类中定义相关的属性

找到项目目录下的items.py文件,在里面定义相关的属性
在这里插入图片描述

class WeiboproItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 在item类中定义相关的属性author = scrapy.Field()title = scrapy.Field()

3. 将解析的数据封装存储到item类型的对象

4. 将item类型的对象提交给管道进行持久化存储的操作

3,4两步在1.中已经体现,具体代码为:

            # 3.将解析的数据封装存储到item类型的对象item = WeiboproItem()item['author'] = authoritem['title'] = title# 4. 将item类型的对象提交给管道进行持久化存储的操作yield item

5. 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作

在这里重写了父类的两个方法:open_spider()和close_spider()方法。
open_spider()方法在开始爬虫时被调用一次,close_spider()方法在爬虫结束时被调用一次。这样实现了yield多次时,只打开关闭一次文件。
process_item()是将得到的item对象中的数据保存到本地。

# pipelines.py 管道文件
class WeiboproPipeline:fp = Nonedef open_spider(self, spider):# 重写父类的方法,只在开始爬虫时被调用一次print("开始爬虫")self.fp = open('./B站.txt', 'w', encoding='utf-8')def process_item(self, item, spider):author = item['author']title = item['title']print("当前写入的是:" + author + ":" + title + "\n")self.fp.write(author + ":" + title + "\n")return itemdef close_spider(self, spider):# 重写父类的方法,在爬虫结束时被调用一次print("结束爬虫")self.fp.close()

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

打开项目weiboPro路径下的settings.py文件,将ITEM_PIPELINES字典取消注释,即可开启管道。

ITEM_PIPELINES = {"weiboPro.pipelines.WeiboproPipeline": 300,
}

运行结果:

运行结束之后,会在本地生成B站.txt文件,其中包含爬取的author和title
在这里插入图片描述

持久化存储2:保存到数据库中。

前言

安装mysql
安装navicat

这里需要安装mysql,我还另外安装了navicat。安装好mysql之后,要新建连接,按照步骤操作即可。

使用终端操作数据库

这里需要mysql库。这个库是用来对数据库进行远程连接的,所以必须要有打开的数据库,打开的表才可以。
在这里插入图片描述

如何使用navicat新建数据库&新建表

建立好之后,再按照上面的6步按部就班来就可以。

1234步与持久化存储1完全相同。

5. 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作

这里的管道文件中的每一个管道类(如持久化存储1的WeiboproPipeline)对应将一组数据存储到一个平台或者载体中。上面的是保存到本地,所以我们还需要将再写一个类来将数据持久化存储到数据库中。

我也有好多东西不理解为什么要这么写

# 管道文件中一个管道类对应将一组数据存储到一个平台或者载体中
class mysqlPileLine:# 每写一个管道类要将这个类写到settings.py的ITEM_PIPELINES中。connect = Nonecursor = Nonedef open_spider(self, spider):# 重写父类的方法,在爬虫开始时调用一次# 创建连接:pymysql.Connectself.connect = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='liu1457154996', db='bzhan', charset='utf8')	# db表示数据库的名称,我上面创建的数据库名称叫bzhan,即上图中的绿色圆柱def process_item(self, item, spider):# 创建游标self.cursor = self.connect.cursor()try:self.cursor.execute('INSERT INTO bzhan (author, title) VALUES ("%s", "%s")' % (item['author'], item['title']))	# 这里的bzhan是bzhan数据库下的表的名称self.connect.commit()print("成功写入数据库", item['author'], item['title'])except Exception as e:print(e)self.connect.rollback()return itemdef close_item(self, spider):self.cursor.close()     # 关闭游标self.connect.close()    # 关闭连接

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

在上面的基础上开启mysqlPileLine管道。

ITEM_PIPELINES = {"weiboPro.pipelines.WeiboproPipeline": 300,"weiboPro.pipelines.mysqlPileLine": 301,
}

运行结果

在终端中输入scrapy crwal weibo后,得到数据库中的结果如下:
在这里插入图片描述

后记:

  • 面试题:将爬取到的数据一份存储到本地一份存储到数据库,如何实现?
    • 管道文件中一个管道类对应的是将数据存储到一种平台
    • 爬虫文件提交的item只会给管道文件中第一个被执行的管道类接受
    • process_item中的return item表示将item传递给下一个即将被执行的管道类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/91358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11下无法打开丛林之狐,提示未检测到DirectX 8.1

新装的win11系统,打开丛林之狐提示未检测到DirectX 8.1. 运行dxdiag检查DirectX版本: DX版本已经是12了: 最终参考了这篇文章解决了: 罪恶都市出现XX-directx version 8.1处理方法 - 知乎 控制面板 > 程序 > 启用或关闭Wi…

小谈设计模式(6)—依赖倒转原则

小谈设计模式(6)—依赖倒转原则 专栏介绍专栏地址专栏介绍 依赖倒转原则核心思想关键点分析abc 优缺点分析优点降低模块间的耦合度提高代码的可扩展性便于进行单元测试 缺点增加代码的复杂性需要额外的设计和开发工作 Java代码实现示例分析 总结 专栏介绍…

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件,可以帮助用户快速地压缩PDF文件,从而减小文件大小,使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法,可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…

7、Docker网络

docker网络模式能干嘛? 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 docker 网络模式采用的是桥接模式,当我们创建了一个容器后docker网络就会帮我们创建一个虚拟网卡,这个虚拟网卡和我们的容器网…

【数据结构】队列和栈

大家中秋节快乐,玩了好几天没有学习,今天分享的是栈以及队列的相关知识,以及栈和队列相关的面试题 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作…

UG\NX二次开发 通过点云生成曲面 UF_MODL_create_surf_from_cloud

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 Rlgun 订阅本专栏,非常感谢。 简介 有网友想做一个通过点云生成曲面的程序,我们也试一下 效果 代码 #include "me.hpp" /*HEAD CREATE_SURF_FROM_CLOUD CCC UFUN */

安全学习_开发相关_Java第三方组件Log4jFastJSON及相关安全问题简介

文章目录 JNDI:(见图) Java-三方组件-Log4J&JNDILog4J:Log4j-组件安全复现使用Log4j Java-三方组件-FastJsonFastJson:Fastjson-组件安全复现对象转Json(带类型)Json转对象Fastjson漏洞复现(大佬文章 JNDI:(见图) …

C# Task任务详解

文章目录 前言Task返回值无参返回有参返回 async和await返回值await搭配使用Main async改造 Task进阶Task线程取消测试用例超时设置 线程暂停和继续测试用例 多任务等最快多任务全等待 结论 前言 Task是对于Thread的封装,是极其优化的设计,更加方便了我…

PL/SQL+cpolar公网访问内网Oracle数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle,是甲骨文公司的一款关系…

Centos 7分区失败,进入 dracut 页面,恢复操作

1. 问题场景: 分区失败,重启了虚拟机,导致系统进入 dracut 页面。开机显示 直接回车,等待重启失败的页面 自动进入了 dracut 模式(救援)。 2. 临时解决进入系统 查了一下:如果出现 “dracut” 提示、进入 dracut…

elementui 菜单选中优化

/** 父级菜单悬浮样式**/ .el-submenu__title:hover {color:#1890ff!important; } /** 父级菜单箭头悬浮样式**/ .el-submenu__title:hover>.el-submenu__icon-arrow{font-size: 13px!important;} /** 子菜单悬浮样式**/ .el-menu-item:hover{color:#1890ff!important; } /*…

数据结构算法--6 希尔排序和计数排序

希尔排序 希尔排序与插入排序原理相同,希尔排序是一种分组插入排序算法 > 首先取一个整数d1n/2,将元素分为d1个组,每组相邻两元素之间距离为d1,在各组内之间插入排序。 > 取第二个整数d2n/2,重复上述分组排序…

VBA技术资料MF62:创建形状添加文本及设置颜色

【分享成果,随喜正能量】须知往生净土,全仗信、愿。有信、愿,即未得三昧、未得一心不乱,亦可往生。且莫只以一心不乱,及得念佛三昧为志事,不复以信、愿、净念为事。。 我给VBA的定义:VBA是个人…

英语单词记忆学习打卡系统 微信小程序

本单词记忆系统使用了计算机语言Java和存放数据的仓库MySQL,采用了微信小程序模式来实现。本系统使用了框架SSM和Uni-weixin实现了单词记忆系统应有的功能,系统主要角色包括管理员和用户。 关键词:Java;MySQL;SSM  在…

【Linux】—— 详解动态库和静态库

前言: 本期我将要给大家讲解的是有关 动态库和静态库 的相关知识!!! 目录 序言 见一见库 为什么要有库 (一)动态库(.so) 1.基本概念 2.命名规则 3.制作动态库 &#xff0…

【学习笔记】CF1817F Entangled Substrings(基本子串结构)

前置知识:基本子串结构,SAM的结构和应用 学长博客 字符串理论比较抽象,建议直观的去理解它 子串 t t t的扩展串定义为 ext(t) : t ′ \text{ext(t)}:t ext(t):t′,满足 t t t是 t ′ t t′的子串,且 occ(t) occ(t…

2023年十大开源项目:革新技术创新

来源整理 : 小托 | 开源社翻译组PM 翻译 : 张锋 | 开源社翻译 Open-source projects have revolutionized the world of software development by fostering innovation, collaboration, and community-driven contributions. These projects are often the backbone of countl…

PHP8的继承和多态-PHP8知识详解

我们在前面的时候讲过《面向对象编程的特点》时,面向对象编程具有3大特点:封装性、继承性和多态性。 继承和多态的根本作用就是完成代码的重用。下面就来讲解php8的继承和多态。 1继承 子类可以继承父类的所有成员变量和成员方法,包括构造方…

玄子Share 设计模式 GOF 全23种 + 七大设计原则

玄子Share 设计模式 GOF 全23种 七大设计原则 前言: 此文主要内容为 面向对象七大设计原则(OOD Principle)GOF(Gang Of Four)23种设计模式拓展的两个设计模式 简单工厂模式(Simple Factory Pattern&#x…

Fake Maxpooling 二维滑动窗口

先对每一行求一遍滑动窗口&#xff0c;列数变为(列数-k1) 再对每一列求一遍滑动窗口&#xff0c;行数变为(行数-k1) 剩下的就是每一个窗口里的最大值啦 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing nam…