【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.rhkb.cn/news/265557.html

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

相关文章

数据价值在线化丨TiDB 在企查查数据中台的应用及 v7.1 版本升级体验

本文介绍了企查查在数据中台建设中使用 TiDB 的经验和应用。通过从 MySQL 到 TiDB 的迁移&#xff0c;企查查构建了基于 TiDB Flink 的实时数仓框架 &#xff0c;充分利用了 TiDB 的分布式架构、MySQL 兼容性和完善的周边工具等特性&#xff0c;实现了数据的在线化处理。2023 年…

搭建 LNMP 架构

一 理论知识 &#xff08;一&#xff09;架构图 &#xff08;二&#xff09;CGI 由来 最早的Web服务器只能简单她响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器&#xff0c;也就是静态html文件&#xff0c;但是后期随着网站功能增多网站开…

k8s service的概念以及创建方法

Service 的功能&#xff1a; Service主要用于提供网络服务&#xff0c;通过Service的定义&#xff0c;能够为客户端应用提供稳定的访问地址&#xff08;域名或IP地址&#xff09;和负载均衡功能&#xff0c;以及屏蔽后端Endpoint的变化&#xff0c;是K8s实现微服务的核心资源。…

java面试说自己的优势,2022必看

纯手打“RocketMQ笔记” 第一节&#xff1a;RocketMQ介绍 1.1 核心概念&#xff08;主题、生产者、消费者、消息&#xff09; 1.2 RocketMQ的设计理念和目标&#xff08;设计理念、设计目标&#xff09; 第二节&#xff1a;RocketMQ中消息的发送 2.1 单向[OneWay]发送&#…

深度学习 精选笔记(5)多层感知机

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 &#xff08;最多只能有128个字符&#xff09;Unicode &#xff08;用于表示世界上几乎所有的文字和符号&#xff09;URL编码 &#xff08;解决服务器只能识别ASCII字符的问题&#xff09;实现&#xff1a;编码_URLEncoder实现&#xf…

【大数据架构(1)】Lambda Architecture – Realtime Data Processing 论文重点翻译

文章目录 1. INTRODUCTION2. LAMBDA ARCHITECTUREA) BATCH LAYERB) SPEED LAYERC) SERVICE LAYER 3. LIMITATIONS OF THE TRADITIONAL LAMBDAARCHITECTURE4. A PROPOSED SOLUTION1. 架构说明2. 前后架构改进对比 1. INTRODUCTION Lambda架构背后的需求是由于虽然MR能够处理大数…

Gitflow:一种依据 Git 构建的分支管理工作流程模式

文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程&#xff0c;主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突&#xff0c;并能快速地完成项目&#xff0c;因此在很多软…

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x Projectpom.xmlOpenAPIConfigFileUploadControllerapplication.yaml Project pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

安全防御-第六次

内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应用层&…

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记

在ROS中&#xff0c;计算图&#xff08;ROS Compute Graph&#xff09;是一个核心概念&#xff0c;它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络&#xff0c;它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…

使用 JMeter 生成测试数据对 MySQL 进行压力测试

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

算法沉淀——动态规划之子序列问题(下)(leetcode真题剖析)

算法沉淀——动态规划之子序列问题 01.最长定差子序列02.最长的斐波那契子序列的长度03.最长等差数列04.等差数列划分 II - 子序列 01.最长定差子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/ 给你一个整数数…

Promise 介绍与基本使用 - 学习笔记

Promise 介绍与基本使用 1、 Promise 是什么&#xff1f;2、创建 Promise 实例对象3、Promise 实例方法4、Promise 的基本工作流程5、实例方法6、静态方法7、async 和 await7.1、关键字7.2、实例7.3、区别7.4、为什么使用 async/await 比较好&#xff1f; 1、 Promise 是什么&a…

【Vite】解决Vite http proxy error: Error: connect ECONNREFUSED

今天写bug&#xff0c;发现了这个问题 我经过我一晚上的搜索努力&#xff0c;在github上找到了解决办法&#xff0c;不得不说&#xff0c;交友网站还是很好用的。 参考 这一行是关键代码。 因为我连的是本地后台服务&#xff0c;所以最后配置成这样 server: {open: true,pro…

Linux浅学笔记04

目录 Linux实用操作 Linux系统下载软件 yum命令 apt systemctl命令 ln命令 日期和时区 IP地址 主机名 网络传输-下载和网络请求 ping命令 wget命令 curl命令 网络传输-端口 进程 ps 命令 关闭进程命令&#xff1a; 主机状态监控命令 磁盘信息监控&#xff1a…

大数据之Flink优化

文章目录 导言&#xff1a;Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

机器学习:SVM算法(Python)

一、核函数 kernel_func.py import numpy as npdef linear():"""线性核函数:return:"""def _linear(x_i, x_j):return np.dot(x_i, x_j)return _lineardef poly(degree3, coef01.0):"""多项式核函数:param degree: 阶次:param …