【python】网络爬虫与信息提取--scrapy爬虫框架介绍

一、scrapy爬虫框架介绍

        scrapy是一个功能强大的网络爬虫框架,是python非常优秀的第三方库,也是基于python实现网络爬虫的重要技术路线。scrapy不是哟个函数功能库,而是一个爬虫框架。

        爬虫框架:是实现爬虫功能的一个软件结构和功能组件集合。

        安装:pip install scrapy

        安装后小测:scrapy -h

        scrapy的组成:

        在这五个模块之间,数据包括用户提交的网络爬虫请求以及从网络上获取的相关内容,在这些结构间进行流动,形成了数据流

        scrapy框架包含三条主要的数据流路径:

        第一条路径(1、2)从spiders到engine的地方获得了爬取用户的请求request,scheduler负责对爬取请求进行调度

        第二条路径(3-6),首先engine从scheduler获得下一个要爬取的网络请求,这个时候的网络请求是真实的要去网络上爬取的请求,那么engine获得这样的请求后,通过中间键发送给downloader模块,downloader模块拿到这个请求后,真实的链接互联网并且爬取相关的网页,爬取到网页后downloader模块将爬取的内容形成一个对象,这个对象叫响应response,那么将所有的内容封装成response后,将这个响应再通过中间键engine最终发送给spiders.

        第三条路径(7、8)首先spiders处理从downloader获得的响应,它处理之后产生了两个数据类型,一个数据类型叫爬取项item,另外一个数据是新的爬取请求,也就是说我们从网络上获得一个网页后,如果这个网页有其他的链接也是我们十分感兴趣的,那么我们就可以在spiders中增加相关的功能,对新的连接发起再次的爬取。engine模块收到这两类数据之后,将其中的item发送给item pipelines,将其中的request发送给sheduler进行调度,从而为后期的再次处理以及再次启动网络爬虫请求提供新的数据来源。

        整个框架的入口的spiders,出口是item pipelines.

        其中,engine,downloaders,scheduler已有实现,用户只需编写item pipelines和spiderws。

二、scrapy爬虫框架解析

        engine:这个模块是框架的核心。用于控制所有模块之间的数据流和根据条件触发事件进行触发。

        downloader:根据用户提供的请求来下载网页。它的功能比较单一,只是获得一个请求并向网络中提交请求,最终获得返回的相关内容。

        scheduler:对所有的爬取请求进行调度管理。

        downloader middleware(用户可以修改代码):目的为实施engine 、schedu;er、downloder之间进行用户可配置的控制。功能为修改、丢弃、新增请求或响应。

        spider(用户主要编写这部分的代码):解析downloader返回的响应(response),产生爬取项(scraped item),并且能产生额外的爬取请求。简单来说,它向整个框架提供了最初始的访问链接,同时对每次返回来的内容进行解析,再次产生新的爬取请求,并且从内容中分析出提取出相关的数据。

        item pipelines(需要用户编写配置代码):以流水线方式处理spider产生的爬取项。由一组操作顺序组成,类似流水线,每个操作是一个item pipeline类型。可能操作包括:清理、检验和查重爬取项中的html数据、将数据存储在数据库中。

        spider middleware(用户可以编写配置代码):目的为对请求和爬取项进行再处理。功能为修改、丢弃、新增请求或爬取项。

三、requests库与scrapy库的比较

        相同点:两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线。两者的可用性都好,文档丰富,入门简单。两者都没有处理js、提交表单、应对验证码等功能(可扩展)的支持。

        不同点:爬取某个网页使用requests,爬取大量网页使用scrapy。

     

        使用建议:非常小的需求使用requests,不太小的需求使用scrapy框架,定制程度很高的需求(不考虑规模)或自搭框架则requests>scrapy。一个爬虫能够持续的,或者不间断的,或者是周期性的爬取一个网站的信息,并且这个数据的想你想我们希望去积累,形成我们之间的爬取库,这种情况适用scrapy框架。

三、scrapy爬虫的常用命令

        scrapy是为了持续运行设计的专业爬虫框架,提供操作的scrap用命令行。

        工具:在windows下通过command启动命令台(命令行更容易自动化,适合脚本控制,本质上,scrapy是给程序员使用的),并且输入命令scrapy -h

        scrapy命令行格式:>scrapy <command> [options] [args]。其中command是scrapy具体命令。

        在scrapy框架下一个工程是最大的单元,一个工程可以相当于大的scrapy框架,而在scrapy中,它可以有多个爬虫,每一个爬虫相当于框架中的一个spider模块.

四、scrapy爬虫的第一个实例

        演示HTML页面地址:http://python123.io/ws/demo.html

        文件名称:demo.html

        步骤如下:

        1、打开命令行,然后切换到我们需要项目的位置(例如切换到D则输入D:)

        2、输入scrapy startproject python123demo,用以创建一个名字为 python123demo的工程。

 

        此时生成的工程目录如下:python123demo为外层目录。scrapy.cfg用于部属scrapy爬虫的部属文件,部属的概念是指将这样的爬虫放在特定的服务器上,并且在服务器配置好相关的接口,对于我们本机使用的爬虫来讲,我们不需要改变部属文件。与scrapy/cfg同目录的python123ddemo是指scrapy框架的用户自定义python代码。_init_.py是初始化脚本,用户不需要编写。items.py是items代码模板(继承类),这里也不需要用户编写。middlewares.py指的是middlewares代码模板(继承类),如果用户需要扩展middlewares,那么就需要把这些功能写到这个文件当中。Pipelines.py对应pipelines代码模板(继承类)。seettings.py是scrapy爬虫的配置文件,如果需要修改功能,就需要修改对应的配置项。spiders是spiders代码模板目录(继承类),这个目录下存放的是python123demo这个工程中所建立的爬虫,这些爬虫需要符合爬虫模板的约束。spiders下的_init_.py是初始文件,无需修改,若运行过的项目,spiders下会多一个_pycache_,为缓存目录,无需修改。

        3.进入工程,在工程中产生一个scrapy爬虫,命令为scrapy genspider demo python123.io,这条命令的作用是生成一个名称为demo的spider。

        这时候发现 在spider下生成了demo.py

  

        以下为demo.py的内容: 

import scrapyclass DemoSpider(scrapy.Spider):name = "demo" #说明当前爬虫的名字叫demoallowed_domains = ["python123.io"]#最开始用户提交命令行的域名,指的是这个爬虫在爬取网站的时候,只能爬取这个域名下的相关链接。start_urls = ["https://python123.io"]#后面以列表形式包含的多个url,事实上就是scrapy框架所要爬取页面的初始页面def parse(self, response):#解析页面的空的方法,用于处理响应,解析内容形成字典,发现新的url爬取请求,self是面向对象所属关系的标记pass

         4.用idle打开demo,然后配置spiders

import scrapyclass DemoSpider(scrapy.Spider):name = 'demo'# allowed_domains = ['python123.io']  不需要 注释掉 start_urls = ['http://python123.io/ws/demo.html']def parse(self, response):fname = response.url.split('/')[-1] #这里面我们从响应的url中提取文件的名字,作为我们保存为本地的文件名,然后我们将返回的内容保存为文件with open(fname,'wb') as f: # 返回的内容保存为文件f.write(response.body)self.log('Saved file %s.' % name)

        5.执行项目:在命令行输入scrapy crawl demo,捕获的页面将被存储在demo.html文件中

        

yield关键字的使用

        yield与“生成器”息息相关。

        生成器是一个不断产生值的函数。包含yild语句的函数是一个生成器。生成器在每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。而唤醒后它所产生的局部变量的值跟之前执行所使用的值是一致的。也就是说,一个函数执行到某个位置,然后它被冻结,再次被唤醒的时候,还是从这个位置继续去执行,那么每次执行的时候,它就可能产生一个数据,这样这个函数就不停的执行。

        生成器大部分与循环一起出现,这样我们就可以使用一个for循环调用生成器。

        使用生成器的好处:更节省存储空间,响应更迅速,使用更灵活。

五、scrapy爬虫的基本使用

        步骤:1.创建一个工程和soider模板 。2、编写spider 。  3、编写item pipeline . 4、优化配置策略。

        涉及的三个类:request类、response类、item类        

        request:class.scrapy.http.Request()。request对象表示一个http请求。由spider生成,由downloader执行。

        

        resopnse:class.scrapy.http.Response()。response对象表示一个http响应。由downloader生成,由spider处理。

        item:class.scrapy.http.Item()。Item对象表示一个从HTML页面中提取的信息内容。由spider生成,由item pipeliner处理。item类似字典类型,可以按照字典类型操作。

        scrapy爬虫提取信息的方法:beautiful Soup,lxml,re,xpath selector,CSS selector。

        CSS selector格式:<html>.css('a::attr(href)').extract()

        

        

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

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

相关文章

AS-V1000 视频监控平台产品介绍:客户端功能介绍(四)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1告警管理 3.1.1告警联动 &#xff08;1&#xff09;告警联动显示 &#xff08;2&#xff09;告警联动处理 3…

基于学习的参数化查询优化方法

一、背景介绍 参数化查询是指具有相同模板&#xff0c;且只有谓词绑定参数值不同的一类查询&#xff0c;它们被广泛应用在现代数据库应用程序中。它们存在反复执行动作&#xff0c;这为其性能优化提供了契机。 然而&#xff0c;当前许多商业数据库处理参数化查询的方法仅仅只…

代码运行时内存分区

计算机科学中&#xff0c;代码运行时的内存通常划分为以下分区&#xff1a; 堆栈 静态区 活跃区 代码段 常量存储区 全局/静态数据区 只读数据区 BSS 段 ----------------------------------- | 代码段 | ----------------------------------- | …

LeetCode--1445. 苹果和桔子

文章目录 1 题目描述2 测试用例3 解题思路 1 题目描述 表: Sales ------------------------ | Column Name | Type | ------------------------ | sale_date | date | | fruit | enum | | sold_num | int | ------------------------(sale…

Uibot (RPA设计软件)智能识别信息+微信群发助手(升级版)———课后练习2

解决痛点&#xff1a; Excel如何计算两个日期之间相差月数 方法&#xff1a; 1、首先打开要进行操作的Excel表格。 2、打开后选中要计算相差月数的单元格。 3、然后输入公式&#xff1a;DATEDIF(A2,B2,"m")&#xff0c;输入完成后点击回车键。 4、在弹出的窗口中&a…

Rancher实用篇-使用rancher,部署微服务应用

说到rancher&#xff0c;我们必须先了解一下k8s 一、k8s简介 Kubernetes&#xff08;通常简写为 K8s&#xff09;是一个开源的容器管理系统&#xff0c;由Google于2014年发起&#xff0c;并在2015年贡献给Cloud Native Computing Foundation (CNCF)进行维护。它基于Borg项目的…

202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈

202427读书笔记|《猫的自信&#xff1a;治愈系生活哲学绘本》——吸猫指南书&#xff0c;感受猫咪的柔软慵懒与治愈 《猫的自信&#xff1a;治愈系生活哲学绘本》作者林行瑞&#xff0c;治愈系小漫画绘本&#xff0c;10分钟可以读完的一本书&#xff0c;线条明媚&#xff0c;自…

Linux-RT特点与简单应用

Linux-RT是指Linux Real-Time&#xff08;实时&#xff09;的简称&#xff0c;它是针对实时性能优化的Linux内核版本。传统的Linux内核并不是专为实时性设计的&#xff0c;因此在一些对实时性要求较高的应用场景下&#xff0c;可能无法满足实时性要求。Linux-RT通过对Linux内核…

【VTKExamples::PolyData】第三十四期 MiscPointData GetMiscPointData

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例MiscPointData,该样例主要介绍如何为PolyData添加PointData属性数据。 VTK样例GetMiscPointData,该样例介绍如何获取PointData属性数据。 希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞…

量化巨头“卖空”被刷屏!网友:又一类量化策略要“收摊”了

量化圈遇到了龙年首宗“大事件”&#xff01; 2月20日晚间&#xff0c;沪深交易所同时出手对量化巨头灵均投资的异常交易行为进行“处理”。 沪深交易所均称发现灵均在2月19日开盘1分钟内&#xff0c;名下多个账户通过计算机程序自动生产交易指令&#xff0c;短时间大量下单卖…

公寓报修|公寓报修管理系统|基于springboot公寓报修管理系统设计与实现(源码+数据库+文档)

公寓报修管理系统目录 目录 基于springboot公寓报修管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、住户管理 2、房间管理 3、维修人员管理 4、维修分类管理 5、物品信息管理 6、维修申请管理管理 四、数据库设计 1、实体ER图 五、核心代码 六、…

IO 作业 24/2/20

一、思维导图 二、习题 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fpNULL;FILE *fqNULL;pid_t pidfork();if(pid>0){if((fpfopen("./text.txt","r"))NULL){perror("fopen error");return -1;} if((f…

天机星在十二宫

文章目录 前言内容总结 前言 天机星在十二宫 内容 天机星在十二宫 天机属木&#xff0c;南斗第三益算是善星&#xff0c;化气为善。 天机星为轴星&#xff0c;有此天机轴星&#xff0c;方能订十八星曜之位。 天机为兄弟宮主。是动星&#xff0c;似轮轴不停转动&#xff0c;…

C++桌面应用开发+编译环境搭建指导

C桌面应用开发编译环境搭建指导 此帖目的&#xff1a;记录本人初次使用Visual Studio 2022(以下简称VS)IDE软件进行Windows桌面应用开发的环境搭建过程&#xff0c;以期对具有相同情况、初次使用和搭建VS开发编译环境进行C开发的小白程序员提供参考作用。 1.下载VS IDE Insta…

鸿蒙将与安卓应用形成“硬分叉”,多家平台急聘鸿蒙开发员

最近&#xff0c;网友注意到&#xff0c;多家企业公布了鸿蒙系统有关的岗位招聘。 11 月 8 日&#xff0c;美团发布了鸿蒙高级工程师、鸿蒙基建工程师等多个鸿蒙开发相关岗位。主要开发美团鸿蒙App、大众点评鸿蒙App。 根据脉脉平台&#xff0c;美团鸿蒙基建工程师岗位给出的…

C++ 二分模版 数的范围

给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 0 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行包含整数 n 和 q &…

HBM可以解决冯诺伊曼架构的陷阱吗?

高带宽内存&#xff08;High Bandwidth Memory, HBM&#xff09;在一定程度上缓解了冯诺伊曼架构中处理器与主存之间的通信瓶颈问题&#xff0c;但并不能完全解决冯诺伊曼陷阱。 HBM是一种先进的3D堆叠式内存技术&#xff0c;它通过将多个DRAM芯片垂直堆叠在一起&#xff0c;并…

C++的std::vector

std::vector是C标准库中的一个序列容器&#xff0c;它封装了动态大小数组的行为。std::vector允许你在运行时动态地添加和删除元素&#xff0c;自动管理存储空间的分配和释放。由于其灵活性和易用性&#xff0c;std::vector在C程序中被广泛使用&#xff0c;特别是在需要存储一系…

JavaScript中手动实现Array.prototype.map方法

在前端开发中&#xff0c;我们经常需要对数组进行操作和处理。在JavaScript中&#xff0c;数组是常用的数据类型之一。而数组的map方法可以将一个数组中的每个元素都进行某种操作&#xff0c;并返回一个新的数组。今天&#xff0c;我们就来手动实现JavaScript中数组原型的map方…

Spring Bean 的生命周期了解么?

Spring Bean 的生命周期基本流程 一个Spring的Bean从出生到销毁的全过程就是他的整个生命周期, 整个生命周期可以大致分为3个大的阶段 : 创建 使用 销毁 还可以分为5个小步骤 : 实例化(Bean的创建) , 初始化赋值, 注册Destruction回调 , Bean的正常使用 以及 Bean的销毁 …