初识Scrapy:Python中的网页抓取神器

Scrapy是一个基于Python的快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。它广泛应用于数据挖掘、监测和自动化测试等领域。Scrapy的强大之处在于它是一个框架,可以根据实际需求进行修改和扩展。

Scrapy的主要特点

  1. 高速抓取:Scrapy使用异步网络库来处理并发请求,使得它能够高效地抓取web页面,并快速提取所需数据。
  2. 定制性强:Scrapy提供了丰富的接口和中间件,允许用户根据需求定制爬虫的各个组件,如请求处理、数据提取、存储等。例如Selenium中间件,借助Redis分布式爬取,使用Pipeline的机制来实现将数据推送到Kafka等.
  3. 数据提取:Scrapy内置了强大的选择器(Selector),可以方便地解析HTML、XML等格式的页面,提取出结构化的数据。
  4. 多线程支持:Scrapy支持多线程并发处理请求,能够快速地爬取大量网页。
  5. 错误处理:Scrapy提供了完善的错误处理机制,可以帮助用户快速定位和处理爬虫程序中的问题。
  6. 自动重试:Scrapy能够自动重试失败的请求,提高爬虫程序的稳定性。
  7. 支持各种数据库:Scrapy可以将提取的数据存储到各种数据库中,如MySQL、MongoDB等。

好了,说了这么多scrapy的优点那接下来就介绍一下它的几个核心组件.

Scrapy的五大核心组件及其工作流程:

image.png

  1. 引擎(Scrapy Engine):这是整个系统的核心,负责处理数据流,并触发事务。它主要负责接收并处理由调度器发过来的请求,以及调度爬虫、下载器和项目管道的工作。
  2. 调度器(Scheduler):这个组件主要用来接受引擎发过来的请求。它由过滤器过滤重复的url并将其压入队列中,在引擎再次请求的时候返回。可以想象成一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么。
  3. 下载器(Downloader):这个组件用于下载网页内容,并将网页内容返回给爬虫。Scrapy下载器是建立在twisted这个高效的异步模型上的。
  4. 爬虫(Spiders):爬虫是主要干活的,它可以生成url,并从特定的url中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
  5. 项目管道(Pipeline):这个组件负责处理爬虫从网页中抽取的实体。主要的功能是持久化存储,例如将提取的数据存储到数据库或进行进一步的数据清洗等。

这些组件通过Scrapy的架构协同工作。当引擎接收到一个请求时,它会调度给调度器进行处理。调度器会查看URL是否已经存在于队列中,如果不存在,它就会添加到队列中并返回给引擎。然后引擎会再次请求下载器来下载这个URL对应的网页内容,下载器会将网页内容返回给爬虫进行处理。爬虫会从网页中提取出所需的信息,并将这些信息封装成Item对象,然后通过项目管道进行进一步的处理和存储。

以上就是Scrapy的五大核心组件及其工作流程。这些组件相互协作,使得Scrapy能够高效地完成网页抓取和数据提取的任务。

而除了这五大组件外还有Middleware中间件也是非常重要的,例如有些网站需要动态获取一些信息,我们可以通过编写自定义的Selenium中间件来执行操作.然后将获取到数据组装成response对象返还给对应的spiders爬虫,以供它去提取解析信息.

如何使用Scrapy

使用Scrapy来创建一个爬虫程序非常简单。首先需要安装Scrapy框架,可以通过pip命令进行安装:


	pip install scrapy

接下来,可以按照以下步骤创建一个简单的爬虫程序:

  1. 创建一个新的Scrapy项目:

	scrapy startproject myproject
  1. 创建一个爬虫类:

	scrapy genspider myspider cnblogs.com
  1. 在爬虫类中定义要爬取的URL和数据提取规则:

	class Myspider(scrapy.Spider):  

	    name = 'myspider'  

	    allowed_domains = ['cnblogs.com']  

	    start_urls = ['http://www.cnblogs.com/']  

	    def parse(self, response):  

	        # 在这里定义数据提取规则,使用选择器(Selector)提取所需数据  

	        # ...
  1. 运行爬虫程序:

	scrapy crawl myspider

以上就是使用Scrapy创建爬虫程序的基本步骤。需要注意的是,Scrapy要求爬虫程序必须按照一定的规范来编写,比如必须定义nameallowed_domainsstart_urls等变量,以及实现parse方法来处理页面数据。这使得Scrapy具有很强的可读性和可维护性。

接下来我们要介绍一下Scrapy爬虫中的钩子函数,以供加深大家对它的生命周期的了解。

Scrapy爬虫中的钩子函数

Scrapy爬虫中的钩子函数(Hook Functions)是在爬虫的生命周期中触发的特定事件时执行的函数。以下是一些常见的Scrapy爬虫钩子函数以及它们的用途:

  1. start_requests(self) : 用于生成初始的请求对象。

def start_requests(self):
    # 返回初始请求对象
    yield scrapy.Request(url='https://example.com', callback=self.parse)
  1. parse(self, response) : 用于处理响应数据并提取信息。

def parse(self, response):
    # 在这里提取信息
    title = response.css('h1::text').extract_first()
    yield {'title': title}
  1. parse_item(self, response) : 用于处理提取的数据并生成爬取的数据项。

def parse_item(self, response):
    item = MyItem()
    item['title'] = response.css('h1::text').extract_first()
    yield item
  1. closed(self, reason) : 在爬虫关闭时执行的函数。

def closed(self, reason):
    # 执行一些清理工作
    pass
  1. process_request(self, request) : 用于在发送请求之前进行预处理。

def process_request(self, request):
    # 修改请求头或URL等
    request.headers['User-Agent'] = 'Custom User-Agent'
  1. process_response(self, response) : 用于在接收响应后进行处理。

def process_response(self, response):
    # 对响应进行处理,如重试或过滤
    return response
  1. process_item(self, item, spider) : 用于在生成数据项后进行处理。

def process_item(self, item, spider):
    # 对数据项进行后处理,如存储到数据库
    return item

这些钩子函数可以在Scrapy爬虫中根据需要覆盖和定制,以实现特定的爬虫行为。

下面是一个爬虫示例:

image.png

如上图所示是一个旅游爬虫的示例,该爬虫通过搜索页面来获取详细页面的URL,再由爬虫进行解析以及模拟点击操作来获取动态数据再次解析.最后清除浏览器实例,释放资源.

Scrapy的应用场景

Scrapy被广泛应用于各种web抓取和数据挖掘任务中。例如,可以用来抓取电商网站上的商品信息、价格、评论等数据,分析竞争对手的销售情况;可以用来抓取新闻网站上的新闻文章、评论等数据,进行舆情分析和新闻聚合;还可以用来抓取社交媒体网站上的用户数据,进行用户行为分析和社交网络分析等。总之scrapy收集的数据经过清洗,预处理和挖掘后将会产生出新的价值.

希望大家读完本篇文章后能对scrapy爬虫框架有一个较为清晰的认识,如果内容对您有帮助,请一键三连(づ ̄3 ̄)づ╭❤~.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行

自己有点笨,查资料查了一周才完美的实现了yolov5在rk3588环境下的运行,在这里写具体步骤希望大家少走弯路。具体步骤如下: 一、yolov5的原代码下载及pt文件转换为onnx文件 1.yolov5的原代码下载及环境搭建 在这里一定要下载正确版本的源代码…

国家药品价格查询官网-在线网站查询方法

查询药品上市价格对于个人和机构来说都是非常有必要的,对个人可以很好的验证该药品是否存在虚高的情况,对药企来说可以根据同类药品市场价格指导自产药品的定价,对其它机构来说了解药品价格可以帮助选择价格合理的药品供应商,降低…

upload-labs关卡10(点和空格绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十关通关思路1、看源代码2、bp抓包绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测…

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。 在互联网信息爆炸的时代,网址复杂而冗长,很难在口头告知他人,也难以分享到社交媒体…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考:一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)-CSDN博客 前提是linux下 已安装docker 命…

基于SpringBoot的SSMP整合案例(消息一致性处理与表现层开发)

消息一致性处理 在后端执行完相应的操作后,我们需要将执行操作后的结果与数据返回前端,前端 调用我们传回去的数据,前端是如何知道我们传回去的数据名称的? 答:前后端遵循了同一个"协议"。这个协议就是定义…

深度学习_14_单层|多层感知机及代码实现

单层感知机: 功能: 能完成二分类问题 问题: 模型训练采用X*W b训练出模型,对数据只进行了一层处理,也就是说训练出来的模型仅是个线性模型,它无法解决XOR问题,所以模型在训练效果上&#xf…

竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …

torch - 张量Tensor常见的形式

1.Scalar 通常就是一个数值 x tensor(42.) 输出x: 2.Vector 特征向量 例如:[-5., 2., 0.]在深度学习中通常表示特征,如词向量特征,某一维度特征等 3.Matrix 一般计算的都是矩阵,通常都是多维的。 可以做矩阵的…

MySQL优化的底层逻辑

文章目录 前言索引的底层结构数据与索引的关系聚簇索引的数据存储普通索引的数据存储 索引的命中逻辑怎么理解索引失效总结 前言 去年刚开始写博客的时候写了一篇《MySQL性能调优参考》,文章中提到优化的几个技巧,比如数据类型的使用、范式和反范式的合…

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点: 速度简单的设计对非线性开发模式的强力支持(允许成千上万个并行开发的分支)完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数…

【C++学习手札】模拟实现vector

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:くちなしの言葉—みゆな 0:37━━━━━━️💟──────── 5:28 🔄 ◀️ ⏸ ▶️ ☰…

微信小程序Error: ENOENT: no such file

问题描述 当编译的时候 会提示找不到这个文件(index),但是确信项目目录里已经删除了该页面路径,并且app.json的pages列表中也 导致这个问题应该是:新添加了文件,后面删除了或者修改了文件名,导…

MySQL初始化报错。VCRUNTIME140_1.dll缺失

从自己电脑内搜索此dll,粘贴到服务器的以下位置即可。

电路综合-基于简化实频的集总参数电路匹配3-将任意阻抗用集总参数匹配至归一化阻抗

电路综合-基于简化实频的集总参数电路匹配3-将任意阻抗用集总参数匹配至归一化阻抗 前面的相关理论: 电路综合-基于简化实频的集总参数电路匹配1 电路综合-基于简化实频的集总参数电路匹配2-得出解析解并综合 理论这两个已经介绍过了,直接给出案例 代码…

「Verilog学习笔记」实现3-8译码器①

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路,同时要求采用基础逻辑门实现,那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…

Python---练习:编写一段Python代码,生成一个随机的4位验证码

案例:编写一段Python代码,生成一个随机的4位验证码 提前:定义一个字符串 str1 "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" 编写Python代码: ① 思考:如果只生成4个字符的验证码&…

黑五来袭,如何利用海外代理进行助力

黑五作为下半年年度尤为重要的一个节日,是各大商家的必争之地,那么海外代理是如何帮助跨境商家做好店铺管理和营销呢? 为什么跨境人都关注海外代理,下面我们来进行介绍。 一、什么是海外代理 海外代理就是我们所说的&#xff1…

锂离子电池充电的系统抖动问题解决方案

前言 在设计锂离子电池充电器时,会因为充电电流波动导致电压波动,系统异常。 所以分析了锂离子电池的特性,给出了几种解决方法。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714qq.com 理论 锂电池简单地可看做一…

VBA_MF系列技术资料1-222

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…