版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章分布式网络爬虫Scrapy-Redis《Python网络爬虫基础教程》学习目标/Target了解分布式网络爬虫,能够说出采用主从模式的分布式网络爬虫的特点熟悉Scrapy-Redis的架构,能够归纳Scrapy-Redis架构的工作原理熟悉Scrapy-Redis的运作流程,能够归纳Scrapy-Redis的运作流程掌握开发Scrapy-Redis的准备工作,能够搭建Scrapy-Redis的开发环境掌握Scrapy-Redis的基本操作,能够灵活应用Scrapy-Redis开发分布式网络爬虫章节概述/Summary前面编写的网络爬虫都运行在单台计算机上,由于受到计算机能力和网络带宽的限制,单台计算机上运行的网络爬虫在采集大量数据时需要花费很长的时间。分布式网络爬虫正好解决了这个问题,它可以在多台计算机上同时运行同一个网络爬虫程序,共同完成一个采集任务。在Python中,Scrapy框架本身并不支持分布式,为弥补该框架的不足,Scrapy-Redis为其拓展了分布式功能,两者结合便可以实现分布式网络爬虫。本章将围绕着分布式网络爬虫Scrapy-Redis的相关知识进行详细的讲解。目录/Contents11.111.211.3分布式网络爬虫简介Scrapy-Redis架构Scrapy-Redis运作流程目录/Contents11.411.511.6Scrapy-Redis开发准备Scrapy-Redis的基本操作实践项目:基于分布式爬虫采集公开课信息分布式爬虫简介11.1了解分布式网络爬虫,能够说出采用主从模式的分布式网络爬虫的特点学习目标11.1分布式网络爬虫简介Scrapy框架是一个通用的网络爬虫框架,应用极其广泛,但Scrapy框架本身并不支持分布式部署,也就是说无法在多台计算机中同时执行网络爬虫程序,导致采集数据的效率受到限制。为了提升网络爬虫的采集效率,Scrapy-Redis在Scrapy的基础上增加了一些以Redis数据库为基础的组件,通过这些组件可以让Scrapy框架实现分布式网络爬虫的功能。11.1分布式网络爬虫简介分布式网络爬虫可以理解为集群爬虫,每个网络爬虫会从互联网上抓取网页数据,并将解析后提取的目标数据保存到文件或数据库中。分布式网络爬虫的设计重点在于多台计算机中的网络爬虫如何进行通信,按不同的通信方式可以分为3种模式,分别是主从模式、自治模式与混合模式。11.1分布式网络爬虫简介11.1分布式网络爬虫简介主从模式指由一台主机作为控制节点,负责管理所有运行网络爬虫的主机,即爬虫节点,爬虫节点只需要从控制节点处接收任务,并把新生成的任务提交给控制节点即可,在整个运行过程中不必与其他爬虫节点进行通信。Scrapy-Redis实现的分布式网络爬虫默认采用了主从模式。1.主从模式11.1分布式网络爬虫简介主从模式易于实现且利于管理,在这种模式下,控制节点会与所有爬虫节点进行通信。它通过一个地址列表保存系统中所有爬虫节点的信息,一旦遇到系统中的网络爬虫数量发生变化,就会更新这个地址列表。这一过程对于系统中的爬虫是透明的。不过,随着网络爬虫采集的网页数量逐渐增加,控制节点会成为整个系统的瓶颈,导致整个分布式网络爬虫的系统性能下降。1.主从模式11.1分布式网络爬虫简介自治模式是指没有协调者、所有的爬虫节点相互通信的模式,它的通信方式主要有两种:全连接通信和环形通信,其中全连接通信是指所有的爬虫节点间相互发送信息;环形通信是指爬虫节点在逻辑上构成一个环形,数据沿着环形按顺时针或逆时针单向传输。2.自治模式11.1分布式网络爬虫简介左图是采用全连接通信方式的自治模式,右图是采用环形通信方式的自治模式。采用全连接通信方式的每个爬虫节点会维护一个地址列表,列表中存储了系统所有爬虫节点的位置。每次通信时可以直接将数据发送给需要此数据的爬虫节点。采用环形通信方式的每个爬虫节点只会保存前驱和后继的信息,爬虫节点在接收到数据之后会判断数据是否是发送给自己的。如果数据不是发送给自己的,则爬虫节点会把数据转发给后继爬虫节点,否则不再转发数据。2.自治模式11.1分布式网络爬虫简介混合模式是指结合上面两种模式的特点生成的一种折中模式,该模式下的所有爬虫节点都可以相互通信
,同时都具有任务分配的功能,只不过所有爬虫节点中有一个特殊的爬虫节点,该爬虫节点会对无法分配的任务进行集中分配。3.混合模式11.1分布式网络爬虫简介混合模式下的每个爬虫节点只需要维护自己采集范围的地址列表,而特殊爬虫节点除了保存自己采集范围的地址列表外,还需要保存需要进行集中分配的地址列表。值得一提的是,Scrapy-Redis实现的分布式网络爬虫默认采用了主从模式,即一台作为控制节点的主机和若干台作为爬虫节点的主机。每个网络爬虫的功能相同,都是负责将服务器返回的Item数据和URL提交给控制节点的主机。控制节点会统一分配爬虫节点提交的任务,它在分配时并非是将某台主机提交的任务分配给该主机,而是发现哪台主机处于空闲状态,便为该主机分配任务。3.混合模式Scrapy-Redis架构11.2熟悉Scrapy-Redis的架构,能够归纳Scrapy-Redis架构的工作原理学习目标11.2Scrapy-Redis架构11.2Scrapy-Redis架构Scrapy-Redis本质上是对Scrapy框架的功能扩展组件集,而非独立框架。借用下面的一个例子区分Scrapy和Scrapy-Redis的关系:将Scrapy视为一个工厂,这个工厂主要负责根据用户的需求生产网络爬虫,其原装设备只适用于单机生产环境,那么Scrapy-Redis便是专业的设备供应商,它为了帮助工厂更好地完成生产任务制造了一些新设备,以替换Scrapy工厂的原装设备,使工厂获得分布式生产的能力。11.2Scrapy-Redis架构对比Scrapy的架构可知,Scrapy-Redis在保留原有架构的基础上引入了两个关键的组件:Redis和ItemProcesses,其中Redis作为键值存储数据库,替代了Scrapy原生的内存调度器,承担着分布式任务调度的角色,负责存放所有爬虫的请求队列和去重集合。每台计算机上的爬虫访问同一个Redis数据库,实现请求的统一调度和去重;ItemProcesses组件则负责处理分布式环境下的Item集群处理。11.2Scrapy-Redis架构根据Redis的特性,Scrapy-Redis在Scrapy原生组件的基础上拓展了4个组件:Scheduler、ItemPipeline、Spiders和DuplicationFilter。Scrapy框架原生的Scheduler基于改造的Python双向队列,形成专用的ScrapyQueue内存队列,这种设计虽然保证了单机环境下的高效调度,但ScrapyQueue存储在进程内存中,无法被跨进程或多个Spiders对象实现共享,根本上限制了框架的分布式扩展能力。Scrapy-Redis通过引入Redis作为分布式队列存储引擎,将请求队列从内存迁移至共享的Redis数据库,实现了多个爬虫对统一任务队列的并发访问,为分布式爬取奠定基础。11.2Scrapy-Redis架构1.Scheduler在改造后的架构中,Scrapy-Redis的Scheduler组件完全重构了任务调度逻辑,它持续监听来自ScrapyEngine的请求提交事件,将新请求原子化地存入Redis;同时响应爬虫的任务请求,通过Redis的阻塞式弹出操作分配待处理请求。这种设计不仅解决了请求共享问题,还通过Redis的持久化特性避免了任务丢失风险,其分布式锁机制也确保了任务分配的唯一性。11.2Scrapy-Redis架构1.SchedulerScrapy-Redis对原生ItemPipeline进行了分布式改造,使其成为连接爬虫与持久化存储的关键中间层。当Spider生成Item后ScrapyEngine会将其序列化并通过RedisPipeline自动存储至指定的Redis数据库。这一设计不仅实现了跨节点的数据统一收集,还保留了Scrapy原生的管道优先级和异常处理机制。11.2Scrapy-Redis架构2.ItemPipelineScrapy-Redis中的Spiders组件使用重新设计的RedisSpider类替代了Scrapy原生的Spider类。RedisSpider类通过多重继承方式,同时继承了Spider基类和RedisMixin功能类,其中RedisMixin类专门负责与Redis数据库建立连接并管理请求的读取操作。11.2Scrapy-Redis架构3.Spiders当实例化一个继承自RedisSpider的自定义爬虫类时,该对象会首先调用setup_redis()方法完成Redis服务连接初始化。连接建立后,系统会自动配置以下两个核心信号机制:空闲状态检测信号。当爬虫节点处于空闲状态时,ScrapyEngine会捕获到特定的空闲信号。此时系统会自动触发spider_idle()回调函数,该函数内部通过调用schedule_next_request()方法从Redis获取新任务分配给当前爬虫。为确保爬虫持续运行,最后会抛出DontCloseSpider异常来阻止爬虫意外终止。数据采集完成信号。每当爬虫成功提取一个Item数据时,ScrapyEngine会接收到这个信号。系统随即执行item_scraped()回调函数,该函数同样通过schedule_next_request()方法立即请求下一个待处理任务,形成连续的数据采集流水线。这种双重信号机制的设计,既保证了分布式环境下任务分配的及时性,又维持了爬虫节点的持续工作状态。11.2Scrapy-Redis架构3.Spiders11.2Scrapy-Redis架构Scrapy框架通过内存集合实现基础去重功能,其工作原理为:系统会为每个请求生成唯一的指纹信息,并将这些指纹存储在内存集合中。当新请求产生时,系统会先计算其指纹并在集合中进行比对,若发现重复指纹则直接丢弃该请求,否则将其加入待处理队列。Scrapy-Redis通过DuplicationFilter组件对去重功能进行分布式改造,该组件利用Redis的Set数据结构特性,将请求指纹存储于Redis服务端。具体流程为:调度器首先接收引擎传递的请求指纹,通过Redis的SADD命令尝试将其添加到去重集合中,根据命令返回值判断请求是否重复:返回1表示新请求,此时将请求加入待爬队列;返回0则表示重复请求。这种设计使得所有爬虫节点共享同一个去重集合,实现真正的全局去重。4.DuplicationFilterScrapy-Redis运作流程11.3熟悉Scrapy-Redis的运作流程,能够归纳Scrapy-Redis的运作流程学习目标11.3Scrapy-Redis运作流程(1)ScrapyEngine从Spiders中获取初始URL。(2)ScrapyEngine将初始URL封装成请求,并将该请求交给Scheduler。(3)Scheduler访问Redis数据库对请求进行判重,如果该请求不是重复的,就将该请求添加到Redis数据库中。(4)当调度条件满足时,Scheduler会从Redis数据库中取出Request交给ScrapyEngine,ScrapyEngine将这个Request通过DownloaderMiddlewares转交给Downloader。11.3Scrapy-Redis运作流程Scrapy-Redis的运作流程如下。11.3Scrapy-Redis运作流程Scrapy-Redis的运作流程如下。(5)一旦页面下载完毕,Downloader会将服务器返回的响应通过DownloaderMiddlewares交给ScrapyEngine。(6)ScrapyEngine通过SpiderMiddlewares发送给Spiders进行处理。(7)Spiders处理响应,并返回采集到的Item数据以及新Request交给ScrapyEngine。(8)ScrapyEngine将爬取到的Item数据通过ItemPipeline交给Redis数据库,将Request给Scheduler。(9)从第2步开始重复,直到Scheduler中没有更多的Request为止。Scrapy-Redis开发准备11.4掌握Scrapy-Redis安装方式,能够在计算机中通过pip进行安装学习目标11.4.1安装Scrapy-Redis安装Scrapy-Redis的方式非常简单,可以直接通过pip工具安装Scrapy-Redis库。pipinstallscrapy-redis==0.9.111.4.1安装Scrapy-Redis运行上述命令,在命令行窗口中可以看到不断输出的安装信息。Scrapy-Redis库安装完成的窗口。安装成功掌握修改Redis配置文件的方式,能够通过修改配置文件允许其他客户端远程连接到Redis服务学习目标11.4.2修改配置文件11.4.2修改配置文件在Windows系统下,Redis数据库的配置文件是redis.windows.conf,该文件默认位于数据库的安装目录下。在配置文件中,bind配置项用于指定绑定的主机地址,默认值为bind,即本机地址,说明只允许本机的客户端访问Redis服务,而不允许其他客户端远程连接Redis服务,防止Redis服务暴露于危险的网络环境中,被其他客户端随意连接。11.4.2修改配置文件以Windows7系统为例,使用文本编辑工具打开redis.windows.conf文件,将该文件中的配置项bind改为bind。redis.windows.conf文件中默认开启了保护模式,此时需要将配置项protected-modeyes改为protected-modeno,以关闭保护模式。熟悉测试远程连接的步骤,能够测试爬虫节点的设备是否能读取Redis数据库中数据学习目标11.4.3测试远程连接11.4.3测试远程连接为保证爬虫节点的设备能够读取Redis数据库中的数据,我们在在执行分布式网络爬虫程序之前需要进行远程连接测试,保证爬虫节点(Slave端)的所有设备可以正常远程连接控制节点(Master端)的Redis数据库。假设现有3台分别装有Windows7、macOS和Ubuntu系统的计算机,其中装有Windows7系统的计算机为Master端,其他两台计算机为Slave端,需要测试Slave端能否可以正常连接到Master端并访问Redis数据库。11.4.3测试远程连接测试远程连接具体步骤如下。(1)在Master端的计算机上以管理员身份打开命令行窗口,然后根据指定的配置文件启动redisserver。redis-serverredis.windows.conf上述命令执行后,控制台输出如下信息,表明Redis服务正常启动。11.4.3测试远程连接测试远程连接具体步骤如下。(2)在Master端的计算机上再次打开新命令行窗口,使用如下命令启动本地客户端redis-cli。redis-cli11.4.3测试远程连接测试远程连接具体步骤如下。(3)在本地客户端中输入ping命令检测本地客户端是否可以连接Redis服务,若连接正常再使用set命令向Redis数据库添加两个键值对。ping命令结果为PONG,说明客户端可以正常连接Redis服务11.4.3测试远程连接测试远程连接具体步骤如下。(4)Slave端的计算机要想连接Master端的Redis数据库,需要在启动客户端时指定Master端的IP地址,若本例中Master端的IP地址为08。在Slave端的终端中输入如下命令启动redis-cli。redis-cli-h08-h参数表示连接到指定主机的Redis数据库。值得一提的是,Slave端的计算机无需无须启动redis-server。11.4.3测试远程连接测试远程连接具体步骤如下。(5)因为在前面已经向Redis数据库中存入了两个键值对,所以可以在Slave端中直接使用get命令获取Redis数据库中的键值对进行测试,一旦准确获取到该键对应的值,说明Slave端的网络爬虫可以正常访问Redis数据库。装有macOS系统的计算机执行命令后的结果装有Ubuntu系统的计算机执行命令后的结果多学一招查看计算机的IP地址在Windows系统的命令提示符窗口中,可使用如下命令查看IP地址。ipconfig以上命令执行后,可以看到WindowsIP配置的具体信息,其中IPv4地址选项对应的值便是当前计算机的IP地址,具体如下所示。WindowsIP配置以太网适配器本地连接:
连接特定的DNS后缀.......:
本地链接IPv6地址........:fe80::8d8d:90f0:3afd:f945%11IPv4地址............:08...省略N行...Scrapy-Redis的基本操作11.5掌握内置下载中间件的使用,能够在爬虫项目启用下载中间件学习目标11.5Scrapy-Redis的基本操作Scrapy-Redis可以看作Scrapy框架的插件,它里面重新实现了Scrapy框架中部分组件的功能,使Scrapy框架支持开发分布式网络爬虫。因此,可以先创建一个Scrapy项目,然后在Scrapy项目中增加Scrapy-Redis的相关配置,并使用替换的组件进行开发。11.5Scrapy-Redis的基本操作打开命令提示符窗口,先切换当前工作路径为项目要存放的目录,再输入创建Scrapy项目的命令,具体命令如下。11.5.1新建Scrapy-Redis项目scrapystartprojectmyDistributedSpider运行上述命令,可以在爬虫目录下看到刚刚创建的myDistributedSpider项目。11.5.1新建Scrapy-Redis项目DUPEFILTER_CLASS用于设置检测与过滤重复请求的类。需要使用Scrapy-Redis的去重组件,交由Redis数据库执行去重操作。增加的配置项示例如下。DUPEFILTER_CLASSDUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"SCHEDULER用于设置调度器。这里,我们需要使用Scrapy-Redis的调度器,交由Redis分配请求。增加的配置项示例如下。SCHEDULERSCHEDULER="scrapy_redis.scheduler.Scheduler"在创建的Scrapy-Redis项目的settings.py文件可增加或修改与Scrapy-Redis相关的配置项。11.5.1新建Scrapy-Redis项目SCHEDULER_PERSIST用于设置是否在Redis数据库中持久化用到的队列。这里,我们无须清理Redis中使用的队列,允许项目在执行中暂停和暂停后恢复。增加的配置项示例如下。SCHEDULER_PERSISTSCHEDULER_PERSIST=True在创建的Scrapy-Redis项目的settings.py文件可增加或修改与Scrapy-Redis相关的配置项。11.5.1新建Scrapy-Redis项目ITEM_PIPELINES用于设置启用管道,它的值是一个包含所有项目管道的字典。ITEM-PIPELINES默认是不启用的。启用该配置项后,Scrapy-Redis会将爬虫抓取的Item数据存储到Redis数据库中。当数据量比较大时,我们一般不会选择启用管道,因为Redis数据库是基于内存存储数据的,直接存储大量数据会影响运行速度。在这里,我们将Item数据直接保存到Redis数据库中。修改后的配置项示例如下。ITEM_PIPELINESITEM_PIPELINES={'myDistributedSpider.pipelines.MydistributedspiderPipeline':100,}在创建的Scrapy-Redis项目的settings.py文件可增加或修改与Scrapy-Redis相关的配置项。若不想让Item数据保存到Redis数据库中,则可以自己编写管道文件,将数据传递到管道中处理。11.5.1新建Scrapy-Redis项目REDIS_HOST用于设置Redis数据库的连接信息,表示Redis所在主机的IP地址。REDIS_HOSTREDIS_HOST='08'REDIS_HOST用于设置Redis数据库的连接信息,表示Redis所在主机的端口。REDIS_PORTREDIS_PORT=6379在创建的Scrapy-Redis项目的settings.py文件可增加或修改与Scrapy-Redis相关的配置项。明确爬虫项目中明确采集目标,能够在Scrapy-Redis中添加爬取字段学习目标11.5.2明确采集目标11.5.2明确采集目标myDistributedSpider项目要采集的目标数据仍然是某培训公司的讲师详情页中的讲师信息,包括讲师的姓名、级别和履历,由于采集目标与第9章案例的采集目标一致,所以仍然添加3个表示讲师姓名、讲师级别和讲师履历的属性。importscrapyclassMydistributedspiderItem(scrapy.Item):name=scrapy.Field()#表示讲师姓名
level=scrapy.Field()#表示讲师级别
resume=scrapy.Field()#表示讲师履历将mySpider\items.py文件中添加属性的代码复制到myDistributedSpider\items.py文件中掌握制作Scrapy爬虫,能够使用Scrapy-Redis提取指定数据学习目标11.5.3制作爬虫Scrapy-Redis的scrapy_redis.spiders模块中定义了两个代表爬虫的类:RedisSpider和RedisCrawlSpider,其中RedisSpider是Spider的派生类,RedisCrawlSpider是CrawlSpider类的派生类,这两个类默认已经拥有了父类中的成员,此外也定义了自己的属性,如redis_key和allowed_domains属性。11.5.3制作爬虫redis_key属性用于设置Redis数据库从哪里获取初始URL,作用类似于start_urls属性。redis_key属性的值是一个字符串,字符串中的内容一般是爬虫名称和start_urls,且两者之间以冒号进行分隔。redis_key=‘itcast:start_urls‘#itcast为爬虫名称
运行Scrapy-Redis项目后,所有的爬虫不会立即执行抓取操作,而是在原地等待Master端发布指令,这是因为所有的爬虫已经没有初始URL了,而是由Redis数据库统一分配与调度采集任务,从Redis数据库中获取请求。11.5.3制作爬虫1.redis_key属性11.5.3制作爬虫allowed_domains属性的作用与之前allowed_domains属性相同,用于设置爬虫搜索的域名范围。allowed_domains属性的值有两种设置方式,一种是按照Spider的原有写法,直接赋值为爬虫搜索的域名范围,另一种方式是动态地获取域名。动态获取域名的示例代码如下。def__init__(self,*args,**kwargs):domain=kwargs.pop('domain','')self.allowed_domains=filter(None,domain.split(','))super(当前类名,self).__init__(*args,**kwargs)2.allowed_domains属性上述代码中,allowed_domains属性能自动获取redis_key属性指定的域名,并将该域名作为允许搜索的域名范围。11.5.3制作爬虫我们在myDistributedSpider项目下创建一个爬虫:爬虫的名称为itcast,爬虫搜索的域名范围为,具体命令如下。scrapygenspideritcast""运行上述命令,可以看到myDistributedSpider/spiders目录下增加了itcast.py文件。itcast.py文件中自动生成的内容如下。importscrapyclassItcastSpider(scrapy.Spider):name='itcast'lowed_domains=['']start_urls=['/']defparse(self,response):pass11.5.3制作爬虫在这里,我们需要将ItcastSpider的父类修改为RedisSpider类,删除start_urls属性的代码,增加设置redis_key属性的代码,并在parse()方法中实现解析目标网页数据的功能,改后的代码如下。classItcastSpider(RedisSpider):name='itcast'#爬虫名称#爬虫搜索的域名范围
allowed_domains=['’]#指定Redis数据库从哪里获取的初始URLredis_key='itcast:start_urls'defparse(self,response):items=[]#存储所有讲师的信息
foreachinresponse.xpath("//div[@class='li_txt']"):item=MydistributedspiderItem()name=each.xpath("h3/text()").extract()level=each.xpath("h4/text()").extract()resume=each.xpath("p/text()").extract()item["name"]=name[0]item["level"]=level[0]item["resume"]=resume[0]items.append(item)returnitems掌握如何运行Scrapy-Redis爬虫,能够启动分布式爬虫学习目标11.5.4运行爬虫11.5.4运行爬虫制作爬虫完成之后,我们就可以采用分布式方式运行网络爬虫程序了。在执行爬虫之前,需要先确定计算机的分配情况,选择哪台计算机为控制节点的主机,负责给其他计算机提供URL分发服务,哪台计算机为爬虫节点的主机,负责执行网页的采集任务,并保证爬虫节点可以成功读取控制节点上Redis数据库中存放的数据。这里准备了3台计算机,它们的分配情况如下。控制节点:一台装有Windows10操作系统的计算机(IP地址为08)。爬虫节点:两台装有Windows10操作系统的计算机。11.5.4运行爬虫(1)在Master端的计算机中,打开命令行窗口,切换当前路径为Redis数据库的安装目录,之后输入如下命令启动redis-server。redis-serverredis.windows.conf(2)将myDistributedSpider项目复制到Slave端。在Slave端的计算机中打开命令行窗口,将当前工作路径切换至myDistributedSpider/spiders目录下。scrapyrunspideritcast.py运行以上命令,此时Slave端的计算机会暂停执行,等待Master端发布指令。值得一提的是,多个Slave端在运行爬虫时无需区分先后顺序。11.5.4运行爬虫(3)在Master端的计算机中,再次打开一个命令行窗口,输入如下命令启动redis-cli。redis-cli(4)使用lpush命令发布指令到Slave端。lpush命令有着固定的格式,具体如下。lpushredis_key初始URL例如,使用lpush命令发布指令采集讲师的信息,具体命令如下lpushitcast:start_urls/channel/teacher.shtml运行上述命令,Slave端的命令行窗口中不断地输出提示信息,开始爬取数据。掌握如何在Scrapy-Redis中使用管道,能够使用管道存储数据学习目标11.5.5使用管道存储数据在Scrapy-Redis项目中,同样也可以定义多个管道,并让这些管道按照一定的顺序依次处理Item数据。11.5.5使用管道存储数据每个管道都是一个独立的Python类,并在该类中必须实现process_item()方法。例如,定义3个管道类:ItacstCsvPipeline类、ItacstRedisPipeline类和ItacstMongoPipeline类。11.5.5使用管道存储数据1.定义管道11.5.5使用管道存储数据(1)ItcastCsvPipeline类ItacstCsvPipeline类负责将数据保存到CSV文件。为方便开发人员读写CSV格式的文件,这里需要结scrapy.exporters模块中CsvItemExporter类的功能,对Item数据进行相应的处理。ItcastCsvPipeline类的定义如下。1.定义管道fromscrapy.exportersimportCsvItemExporterclassItcastCsvPipeline:defopen_spider(self,spider):self.file=open("itcast.csv","wb")#根据CSV文件创建文件对象
self.csv_exporter=CsvItemExporter(self.file,encoding='utf-8-sig')self.csv_exporter.start_exporting()#标识开始导出文件
defprocess_item(self,item,spider):self.csv_exporter.export_item(item)#将Item数据写入文件中
returnitemdefclose_spider(self,spider):self.csv_exporter.finish_exporting()#标识结束导出文件
self.file.close()#关闭文件11.5.5使用管道存储数据ItcastCsvPipeline类中实现了3个方法:open_spider()方法、process_item()方法和close_spider()方法。其中,open_spider()方法指定了爬虫运行前执行的操作,即根据CSV文件创建CsvItemExporter类的对象,并调用start_exporting()方法标识开始导出文件操作;process_item()方法指定了爬虫对Item数据的处理操作,即调用export_item()方法将Item数据导出为CSV文件;close_spider()方法指定了爬虫运行后执行的操作,即调用finish_exporting()方法标识结束导出文件操作,关闭文件对象。1.定义管道fromscrapy.exportersimportCsvItemExporterclassItcastCsvPipeline(object):defopen_spider(self,spider):self.file=open("itcast.csv","w")#根据CSV文件创建文件对象self.csv_exporter=CsvItemExporter(self.file)#创建CsvItemExporter类的对象self.csv_exporter.start_exporting()#标识开始导出文件defprocess_item(self,item,spider):self.csv_exporter.export_item(item)#将Item数据写入文件中returnitemdefclose_spider(self,spider):self.csv_exporter.finish_exporting()#标识结束导出文件
self.file.close()#关闭文件11.5.5使用管道存储数据ItacstCsvPipeline类ItcastCsvPipeline类的定义如下。1.定义管道importredis,jsonclassItcastRedisPipeline(object):defopen_spider(self,spider):#建立与Redis数据库的连接
self.redis_cli=redis.Redis(host="9",port=6379)#建立与Redis数据库的连接defprocess_item(self,item,spider):#指定了爬虫对Item数据的处理操作。
content=json.dumps(dict(item),ensure_ascii=False)#将Item数据转换成JSON对象self.redis_cli.lpush("ITCAST_List",content)#将content插入Redis数据库returnitem11.5.5使用管道存储数据(2)ItcastRedisPipeline类ItacstRedisPipeline类负责将数据保存到Redis数据库。1.定义管道11.5.5使用管道存储数据在ItcastRedisPipeline类中实现了两个方法:open_spider()方法和process_item()方法。其中,open_spider()方法指定了爬虫运行前执行的操作,即建立与Redis数据库的连接;processs_item()方法指定了爬虫对Item数据的处理操作,即先调用dumps()方法将Item数据转换成JSON对象content,再调用lpush()方法将content插入Redis数据库,并以列表的形式进行存储。1.定义管道importpymongoclassLtcastMongoPipeline(object):#指定了爬虫运行前执行的操作defopen_spider(self,spider):
self.mongo_cli=pymongo.MongoClient(host="",port=27017)#建立与MongoDB数据库的连接
self.db=self.mongo_cli["itcast"]#创建数据库
self.sheet=self.db['itcast_item']#创建集合defprocess_item(self,item,spider):#指定了爬虫对Item数据的处理操作self.sheet.insert(dict(item))returnitem11.5.5使用管道存储数据(3)ItcastMongoPipeline类ItacstMongoPipeline类负责将数据保存到MongoDB数据库。1.定义管道11.5.5使用管道存储数据在ItcastMongoPipeline类中同样实现了两个方法:open_spider()方法和process_item()方法。其中,open_spider()方法指定了爬虫运行前执行的操作,即建立与MongoDB数据库的连接;process_item()方法指定了爬虫对Item数据的处理操作,即调用insert_one()方法将Item数据插入集合sheet。1.定义管道ITEM_PIPELINES={'ItcastSpider.pipelines.ItacstCsvP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年养老机构药品管理制度与分发差错防范
- 2026年脑电图异常放电与抗癫痫处理措施
- 上海立达学院《安全生产管理知识》2025-2026学年第一学期期末试卷(A卷)
- 上海立达学院《AutoCAD 机械制图》2025-2026学年第一学期期末试卷(A卷)
- 2026年项目负责人安全管理责任清单
- 自行车轻量化结构优化
- 上海立信会计金融学院《ARM 嵌入式系统》2025-2026学年第一学期期末试卷(A卷)
- 2026年门诊会诊及转诊工作流程
- 绿色技术在投资中的应用
- 2026年换热器选型与设计计算示例
- 朱德的扁担课件
- 消防员中级资格理论考试试题
- 头晕眩晕教案
- 汽车发动机连杆的优化设计
- 各种恶劣天气行车安全培训
- 2025年国防教育知识竞赛题库与答案
- 医保结算清单管理制度范本
- 成人健康体重管理白皮书
- 小儿推拿肺经课件
- 纯碱工业生产安全操作规程
- 高中学生社会实践活动记录表
评论
0/150
提交评论