手机端官网设计,群站优化之链轮模式,好用的海报设计网站,移动wap是什么意思1、Scrapy框架初识#xff08;点击前往查阅#xff09;
2、Scrapy框架持久化存储
3、Scrapy框架内置管道#xff08;点击前往查阅#xff09;
4、Scrapy框架中间件#xff08;点击前往查阅#xff09; Scrapy 是一个开源的、基于Python的爬虫框架#xff0c;它提供了…1、Scrapy框架初识点击前往查阅
2、Scrapy框架持久化存储
3、Scrapy框架内置管道点击前往查阅
4、Scrapy框架中间件点击前往查阅 Scrapy 是一个开源的、基于Python的爬虫框架它提供了强大而灵活的工具用于快速、高效地提取信息。Scrapy包含了自动处理请求、处理Cookies、自动跟踪链接、下载中间件等功能
Scrapy框架的架构图先学会再来看就能看懂了 一、持久化存储文本
1基于终端指令的存储
基于终端指令简单但是局限性较大。
scrapy crawl myspider -o project_name.后缀名命令讲解 例scrapy crawl baidu -o baidudata.json
myspider执行的爬虫文件名project_name.后缀名想要保存的文件名和格式具体格式参考下面 终端指令的方法只可以将parse方法的返回值存储到指定后缀的文本文件中。且格式只能是如下展示的。 1.1执行代码
import scrapyclass BaiduSpider(scrapy.Spider):# 爬虫文件的唯一标识就是你创建的爬虫文件夹名字name baidu# 允许的域名这个代表你只能访问这个网址的子域名其他的都会禁止这个我们会注释掉不会打开# allowed_domains [www.xxx.com]# 起始的url列表网址可以随便放可以放多个列表中的url都会被框架进行异步请求发送。start_urls [https://www.xiachufang.com/category/40076/]# 数据解析parse调用的次数取决于start_urls列表元素的个数def parse(self, response): # response参数就表示响应对象# 创建一个空列表用于存储all_data []# 利用xpath解析:scrapy内置xpath无需另外导入li_list response.xpath(//div[classpure-u-3-4 category-recipe-list]//ul/li)for li in li_list:# 1、scrapy中的xpath会返回Selector对象我们需要的数据在该对象data属性中extract可以实现该功能,# 2、extract_first()就是取第一个因为文本两边有空格所以.strip() 可以去除两侧的空格title li.xpath(.//p[1]/a/text()).extract_first().strip()author li.xpath(.//p[4]/a/text()).extract_first().strip()# 将每次获取到的标题和作者添加到字典中dic {title: title,author: author}# 将字典添加到列表中all_data.append(dic)# 爬取到的数据被作为parse方法的返回值return all_data
1.1执行结果分析
此代码在这个Scrapy框架初识点击前往查阅代码上就加了前4步如下图。
第5步执行代码第6步最后生成的文件Scrapy框架初识点击前往查阅 基于终端指令存储就是这样的虽然简单但是局限性很大。 2基于管道的存储存入本地文件
基于管道的形式相比较终端复杂但是灵活性很大。
管道存储so easy 只需5步
2.1在爬虫文件中进行数据解析操作。
解析代码如下⬇️
import scrapyclass BaiduSpider(scrapy.Spider):# 爬虫文件的唯一标识就是你创建的爬虫文件夹名字name baidu# 允许的域名这个代表你只能访问这个网址的子域名其他的都会禁止这个我们会注释掉不会打开# allowed_domains [www.xxx.com]# 起始的url列表网址可以随便放可以放多个列表中的url都会被框架进行异步请求发送。start_urls [https://www.xiachufang.com/category/40076/]# 数据解析parse调用的次数取决于start_urls列表元素的个数def parse(self, response): # response参数就表示响应对象# 创建一个空列表用于存储all_data []# 利用xpath解析:scrapy内置xpath无需另外导入li_list response.xpath(//div[classpure-u-3-4 category-recipe-list]//ul/li)for li in li_list:# 1、scrapy中的xpath会返回Selector对象我们需要的数据在该对象data属性中extract可以实现该功能,# 2、extract_first()就是取第一个因为文本两边有空格所以.strip() 可以去除两侧的空格title li.xpath(.//p[1]/a/text()).extract_first().strip()author li.xpath(.//p[4]/a/text()).extract_first().strip() 2.2创建一个item类型的对象。
创建的item对象需要封装自己需要的变量。例如我需要title、author两个变量框架中有封装好item类型文件 2.2.1将解析到的数据存储到该对象中。
如何将解析好的数据存储到item对象中呢各位看官接着往下看 2.3将item对象提交给管道。
什么是管道呢管道在框架中在哪呢就在这 如何将item对象提交给管道呢只需要 yield 关键字就可以了 2.4在管道中实现process_item的函数实现对item对象的接收对其进行指定的持久化存储。 代码讲解return是有多个管道把数据传递给下一个后面会讲解
open_spider函数这个函数只会在process_item函数之前之前执行一次所以这就操作的空间了我们可以先定义一个全局变量然后在这个函数中创建一个文件句柄。process_item函数self调用写入数据就行了。close_spider函数该函数会在process_item函数完全执行结束之后调用一次这个里边就关闭文件就行了。
错误演示❌❌❌ 可能会有同学会想到用这个方法来储存这就要想到一个问题了process_item函数会被执行很多次执行的次数取决于爬虫文件提交的次数所以这个方法肯定是不行的。 2.5在配置文件中开启管道功能。
注释去掉就是开启了后面的300是优先级的如果有多个管道会用到数字越小优先级越高下面会讲另外UA或者Cookie一些反爬根据网站需求决定是否开启 2.6执行结果 执行指令my_spider就是你的爬虫文件名字
scrapy crawl my_spider
执行代码
# Define your item pipelines here
#
# Dont forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass CsdnPipeline:fp None # 全局变量。# 该函数只会被在process_item函数调用前被调用一次。def open_spider(self, item):# 创建文件self.fp open(baidu.txt, w)# 该函数只会被在process_item函数完全执行结束后被调用一次。def close_spider(self, item):# 关闭文件self.fp.close()# 该函数是用来接收爬虫文件提交过来的item对象此函数执行次数取决于爬虫文件提交的次数def process_item(self, item, spider): # item参数就表示接收到的item对象。# 将item中的数据取出来title item[title]author item[author]# 数据写入self.fp.write(title : author \n)return item以我们设置的文件格式文件名字储存好了。 二、基于管道的存储存入数据库
首先肯定要先安装MySQL数据库的没有安装可以参考最新版MySQL安装 配置 启动
还需要安装模块用于操作MySQL数据库
pip install pymsql
存到数据库步骤数据库要提前开启哦
和存入本地文件唯一不同的地方就在第四步管道函数的编写下面我们就把这方面重点分析一下
1settings中配置 前面还提到了 yield 的关键字是提交给管道的他优先提交给数字小的也就是优先级高的。 2管道原理剖析 还记得前面的 return吗现在来填坑了
如果 你需要一个管道就OK了下面不需要了那OK不需要return也是可以的但是你下面还有管道那必须要return的不然你数据无法传递下去并且还会报错。 3代码编写
首先要学会Python操作MySQL方法不会的可以参考这Python操作中MySQL数据方法
此代码指针对MySQL数据库的完整的需要包含上面 class CsdnPipeline 中的代码
import pymysql # 导入操作数据库模块class MysqlPipeline:# 1、创建一个链接对象conn pymysql.connect(host127.0.0.1, # mysql服务器的ip地址port3306, # mysql默认端口号userroot, # mysql用户名passwordroot1234, # mysql密码dbspider, # mysql指定的数据库)# 2、创建一个游标对象用来执行sql语句cursor conn.cursor()def process_item(self, item, spider):# 利用上面传入的item我们先获取到数据title item[title]author item[author]# 将2个字段存储到mysql数据表中sql insert into bili(title,author) values ({},{}).format(title, author)# 使用游标对象执行sql语句self.cursor.execute(sql)# 提交事物最后才会将数据存入数据库中self.conn.commit()return itemdef close_spider(self, spider):# 关闭游标和链接对象self.cursor.close()self.conn.close() 代码分析 其中主要就是数据库的链接要提前创建好表和对应的字段然后会简单的SQL语句。 4执行结果 三、基于管道的存储存入Redis缓存中 首先肯定要先安装Redis的没有安装可以参考手把手安装部署Redis 还需要安装模块用于操作Redis这个安装个低版本的高的有些数据格式不支持例如字典就不行的。
pip install redis2.10.6
存到Redis步骤Redis要提前开启哦
和上面一样的唯一不同的地方就在第四步管道函数的编写下面我们就把这方面重点分析一下
1settings中配置 2代码编写 此代码指针对Redis缓存的完整的需要包含上面 class CsdnPipeline 和 class MysqlPipeline 中的代码。
from redis import Redis # 导入模块class RedisPipeline:# 创建链接对象conn Redis(host127.0.0.1, port6379)def process_item(self, item, spider):# 将item这个字典存储到redis中self.conn.lpush(bili, item) # lpush(参数1参数2)参数1新建列表的名称参数2是向列表中存储的数据return item 代码分析 Redis的比较简单主要就是连接按照这个写就行了没有啥理解的固定语法。 3执行结果 自此Scrapy框架持久化存储的2种方法就这些了另外还有就是图片和视频的持久存储在内置管道中讲解。