【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南

  🌈个人主页:易辰君-CSDN博客
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、阻塞和非阻塞

(一)阻塞

(二)非阻塞

二、Scrapy的工作流程

三、Scrapy每个模块的具体作用

(一)Engine引擎

(二)Scheduler调度器

(三)Downloader下载器

(四)Spider爬虫

(五)Item Pipeline数据管道

(六)Downloader Middlewares下载中间件

(七)Spider Middlewares爬虫中间件

(八)Extensions扩展

(九)Item数据对象

(十)Signals信号

四、Scrapy的入门使用

(一)安装 Scrapy

(二)创建 Scrapy 项目

(三)编写爬虫

(四)运行爬虫

(五)保存数据

(六)常见配置修改

(七)调试与扩展

五、总结


前言

在大数据时代,网络爬虫成为获取信息的重要工具,而 Scrapy 是其中的佼佼者。作为一个功能强大且高效的 Python 爬虫框架,它不仅支持复杂的网页抓取,还能通过非阻塞的异步机制极大提升爬取性能。然而,许多人在初学时常常被阻塞与非阻塞的概念以及 Scrapy 的模块化设计弄得一头雾水。这篇文章将从基础的阻塞与非阻塞概念出发,逐步深入解析 Scrapy 的工作流程和模块作用,最后通过一个完整的入门实例,帮助你快速掌握这款高效爬虫框架。


一、阻塞和非阻塞

在学习 Scrapy 时,理解阻塞和非阻塞是非常重要的,这直接影响到爬虫的性能和并发能力。

(一)阻塞

阻塞是指代码在执行某个操作时,会等待这个操作完成后,才会继续执行后续的代码。

  • 特点:代码会暂停,直到当前任务完成,其他任务会因此被延迟。

  • 缺点:在网络爬虫中,阻塞的网络请求会降低效率。例如,如果某个请求需要 2 秒才能返回数据,这 2 秒内程序不能做其他任何事情。

示例:

import timedef blocking_example():print("任务开始")time.sleep(2)  # 模拟阻塞操作print("任务完成")blocking_example()

输出:

任务开始
(等待2秒)
任务完成

在爬虫中,如果你使用了阻塞的网络请求库(例如 requests),程序会等待每个请求完成后才继续处理下一个请求。

(二)非阻塞

非阻塞是指代码不会等待某个操作完成,而是直接继续执行其他代码。

  • 特点:异步任务可以被调度,程序不会因单个任务的延迟而停滞。

  • 优点:在 Scrapy 中,非阻塞机制允许同时发出多个网络请求,大幅提高爬取速度。

异步调用示例:

import asyncioasync def non_blocking_example():print("任务开始")await asyncio.sleep(2)  # 模拟非阻塞操作print("任务完成")asyncio.run(non_blocking_example())

输出:

任务开始
(任务等待中,但主线程未阻塞)
任务完成

在爬虫中,Scrapy 利用了 Twisted 框架的异步特性来管理非阻塞 I/O,使得多个请求可以同时进行。


二、Scrapy的工作流程

Scrapy 的工作流程可以分为以下关键步骤,每个步骤紧密配合以实现高效的爬取和解析:

  • 引擎启动
    Scrapy 引擎负责协调各个模块的工作,包括调度器、下载器和爬虫代码。它是 Scrapy 的核心。

  • 调度器调度请求
    引擎将初始的请求发送给调度器。调度器按优先级对请求进行排序,并将它们排队等待执行。

  • 下载器下载页面
    调度器将请求发送给下载器,下载器负责根据请求的 URL 抓取对应的网页内容。

  • 爬虫处理响应
    下载的页面内容被传回引擎,并交给爬虫的回调函数(如 parse 方法)进行处理。爬虫提取所需数据并生成新的请求(递归爬取)。

  • 解析与提取

    • 提取到的数据会被交给 Item Pipeline 进一步清洗、验证和存储,如存入数据库或文件。

    • 中间件在请求和响应过程中允许对内容进行额外处理,如添加 headers、代理、错误处理等。

  • 循环重复
    生成的新请求再次交给调度器,重复上述流程,直到所有请求完成。

工作流程总结:

  1. 爬虫将初始请求发送给引擎。

  2. 引擎将请求传递给调度器。

  3. 调度器按优先级将请求发送给引擎。

  4. 引擎将请求传递给下载器。

  5. 下载器获取网页内容并返回响应。

  6. 引擎将响应发送给爬虫。

  7. 爬虫解析响应,生成数据和新的请求。

  8. 数据经过管道处理后存储,新的请求被传回调度器。


三、Scrapy每个模块的具体作用

Scrapy 是一个流行的 Python 爬虫框架,由多个模块组成,各模块协同工作以实现高效的数据抓取和处理。以下是 Scrapy 中各模块的具体作用:

(一)Engine引擎

  • 作用:

    • Scrapy 的核心模块,负责协调其他组件之间的工作流。

    • 它根据预定义的爬取规则控制数据流在框架内的流转,包括调度器、下载器、爬虫以及管道之间的交互。

  • 主要职责:

    • 处理调度器队列中的请求。

    • 将请求发送到下载器。

    • 接收下载器的响应并将其传递给爬虫。

    • 从爬虫中获取新的请求或 Item 并传递给相应组件。

(二)Scheduler调度器

  • 作用:

    • 用于管理请求队列。

    • 确保请求的优先级和去重,避免重复抓取相同的 URL。

  • 主要职责:

    • 接收引擎发来的请求。

    • 按照优先级对请求进行排序。

    • 将下一个请求交回给引擎。

(三)Downloader下载器

  • 作用:

    • 负责将调度器传来的请求发送到目标网站并获取网页内容。

  • 主要职责:

    • 执行 HTTP/HTTPS 请求。

    • 处理网络请求相关的中间件(如代理、用户代理设置)。

    • 返回网站响应(如 HTML、JSON 数据)。

(四)Spider爬虫

  • 作用:

    • 用户定义爬取逻辑的核心模块。

    • 从下载器传递的响应中提取所需的数据和后续需要爬取的 URL。

  • 主要职责:

    • 编写爬取规则(解析页面,提取数据,生成新的请求)。

    • 将提取的数据传递给 Item Pipeline 或调度器。

(五)Item Pipeline数据管道

  • 作用:

    • 用于对提取到的数据进行进一步处理(清理、验证、存储)。

  • 主要职责:

    • 接收 Spider 提取的数据(Item)。

    • 对数据进行清洗、去重、校验。

    • 存储数据到数据库、文件或其他目标位置。

(六)Downloader Middlewares下载中间件

  • 作用:

    • 位于引擎与下载器之间,用于对请求和响应进行处理。

    • 常用于修改请求头、设置代理、处理验证码等功能。

  • 主要职责:

    • 对即将发送的请求进行修改。

    • 对下载后的响应进行预处理。

(七)Spider Middlewares爬虫中间件

  • 作用:

    • 位于引擎和 Spider 之间,用于对 Spider 的输入和输出数据进行处理。

  • 主要职责:

    • 过滤、修改或扩展 Spider 输入的响应。

    • 处理 Spider 输出的请求或 Item。

(八)Extensions扩展

  • 作用:

    • 用于提供额外功能,例如日志记录、性能监控、信号处理等。

  • 主要职责:

    • 扩展 Scrapy 功能,例如设置超时重试、统计抓取进度等。

(九)Item数据对象

  • 作用:

    • 定义抓取的数据结构。

  • 主要职责:

    • 用于描述从网页中提取的数据字段及其属性。

(十)Signals信号

  • 作用:

    • 用于框架内事件的订阅与触发,便于实现钩子机制。

  • 主要职责:

    • 处理事件通知,如爬虫开始、爬虫结束、异常发生等。


四、Scrapy的入门使用

Scrapy 的入门使用主要包括安装、创建项目、编写爬虫以及数据保存等基本步骤。以下是详细流程:

(一)安装 Scrapy

使用 pip 安装:

pip install scrapy

确认安装成功:

scrapy --version

(二)创建 Scrapy 项目

创建一个新的项目:

scrapy startproject myproject

项目结构:

myproject/├── myproject/          # 项目模块│   ├── __init__.py│   ├── items.py        # 定义数据结构│   ├── middlewares.py  # 中间件│   ├── pipelines.py    # 数据管道│   ├── settings.py     # 配置文件│   └── spiders/        # 爬虫目录└── scrapy.cfg          # 项目配置

(三)编写爬虫

进入项目目录:

cd myproject

创建爬虫:

scrapy genspider example example.com

修改 spiders/example.py,示例爬取 quotes.toscrape.com:

import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['http://quotes.toscrape.com']def parse(self, response):for quote in response.css('div.quote'):yield {'text': quote.css('span.text::text').get(),'author': quote.css('span small.author::text').get(),'tags': quote.css('div.tags a.tag::text').getall(),}

(四)运行爬虫

执行命令运行爬虫:

scrapy crawl example

(五)保存数据

直接保存爬取结果为 JSON、CSV 或 XML 文件:

scrapy crawl example -o output.json

(六)常见配置修改

修改 settings.py

DOWNLOAD_DELAY = 2

启用 User-Agent:

USER_AGENT = 'myproject (+http://www.example.com)'

(七)调试与扩展

使用调试工具检查 CSS 或 XPath 选择器:

scrapy shell 'http://quotes.toscrape.com'

在管道、下载中间件或扩展中实现更复杂功能。

五、总结

Scrapy 是一个以模块化、异步非阻塞为核心的爬虫框架,通过精细的组件协作,提供了高效抓取、数据处理和存储的能力。从理解阻塞与非阻塞的机制,到掌握 Scrapy 的引擎、调度器、下载器和中间件的作用,再到编写第一个爬虫,完整的流程让你从零起步,逐步进入 Scrapy 的世界。熟悉这些模块和配置后,你将不仅能快速构建爬虫项目,还能在复杂场景中灵活应对,实现数据抓取的高效化与专业化。

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

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

相关文章

【Python数据分析五十个小案例】电影评分分析:使用Pandas分析电影评分数据,探索评分的分布、热门电影、用户偏好

博客主页:小馒头学python 本文专栏: Python数据分析五十个小案例 专栏简介:分享五十个Python数据分析小案例 在现代电影行业中,数据分析已经成为提升用户体验和电影推荐的关键工具。通过分析电影评分数据,我们可以揭示出用户的…

第八篇:CamX RawHdr Feature Enable

CamX RawHdr Feature Enable RawHdr feature介绍: 试用于拍照场景,输入3张Raw,输出一张Raw。 对应的pipeline: camxSWMFMergeRaw.xml (usecases: UsecaseZSL) featureGraph: RTRawHDRBayer2YUVJPEG ​ RT -> RawHdr -> Bayer2Yuv -> JPEG RTRawHDRBayer2YUVJPE…

Python毕业设计选题:基于django+vue的期货交易模拟系统的设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 期货信息 个人中心 管理员登录界面 管理员功能界面 用户管理 期货公司管理…

文件内容扫描工具

简介 文件扫描助手是一款基于Vite Vue 3 Electron技术栈开发的跨平台桌面应用程序。它提供了强大的文件内容搜索功能,支持Word、Excel、PDF、PPT等常见办公文档格式。用户可以通过关键词快速定位到包含特定内容的文件,极大地提高了文件管理和查找效率…

数据结构--AVL树(平衡二叉树)

✅博客主页:爆打维c-CSDN博客​​​​​​ 🐾 🔹分享c、c知识及代码 🐾 🔹Gitee代码仓库 五彩斑斓黑1 (colorful-black-1) - Gitee.com 一、AVL树是什么?(含义、性质) 1.AVL树的概念 AVL树是最…

【算法】连通块问题(C/C++)

目录 连通块问题 解决思路 步骤: 初始化: DFS函数: 复杂度分析 代码实现(C) 题目链接:2060. 奶牛选美 - AcWing题库 解题思路: AC代码: 题目链接:687. 扫雷 -…

24.11.26 Mybatis2

resultMap 中的标签和属性 如果是主键列 一般用id标签对应 propertyjava对象的属性 column 数据库中的列( javaType实体类数据类型 jdbcType数据库列的数据类型 ) 不需要配置 <id property"empno" column"empno" />如果是普通列 一般用result对…

Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)

14.1 命令请求的执行过程 一个命令请求从发送到获得回复的过程中&#xff0c;客户端和服务器都需要完成一系列操作。 14.1.1 发送命令请求 当用户在客户端中输入一个命令请求的时候&#xff0c;客户端会把这个命令请求转换为协议格式&#xff0c;然后通过连接到服务器的套接字…

ArcGIS pro中的回归分析浅析(加更)关于广义线性回归工具的补充内容

在回归分析浅析中篇的文章中&#xff0c; 有人问了一个问题&#xff1a; 案例里的calls数据貌似离散&#xff0c;更符合泊松模型&#xff0c;为啥不采用泊松而采用高斯呢&#xff1f; 确实&#xff0c;在中篇中写道&#xff1a; 在这个例子中我们为了更好地解释变量&#x…

【面试题】2025年百度校招Java后端面试题

文章目录 前言一、网络IO1、服务器处理并发请求有哪几种方式&#xff1f;2、说一下select&#xff0c;poll&#xff0c;epoll的区别&#xff1f;3、Java 有一种现代的处理方式&#xff0c;属于异步I/O&#xff0c;是什么&#xff1f;redis&#xff0c;nginx&#xff0c;netty 是…

【Zookeeper 和 Kafka】为什么 Zookeeper 不用域名?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

RiceChem——用于评估大语言模型在教育领域自动长答卷评分 (ALAG) 的数据集

摘要 论文地址:https://arxiv.org/abs/2404.14316 源码地址&#xff1a;https://github.com/luffycodes/automated-long-answer-grading 迄今为止&#xff0c;教育领域的自然语言处理&#xff08;NLP&#xff09;主要集中在简答题评分和自由文本作文评分方面。然而&#xff0c…

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 前言&#xff1a;在 Java编程的广袤世界里&#xff0c;数据结构犹如精巧的建筑蓝图&#xff0c;决定着程序在数据处理与存储时的效率、灵活性以…

【04】Selenium+Python 手动添加Cookie免登录(实例)

一、什么是Cookie&#xff1f; Cookie 是一种由服务器创建并保存在用户浏览器中的小型数据文件。它用于存储用户的相关信息&#xff0c;以便在后续访问同一网站时可以快速检索这些信息。Cookie 主要用于以下几个方面&#xff1a; 1.状态管理&#xff1a; Cookie 可以保存用户…

GitLab|应用部署

创建docker-compose.yaml文件 输入docker-compose配置 version: 3.8 services:gitlab:image: gitlab/gitlab-ce:15.11.2-ce.0restart: alwayscontainer_name: gitlab-ceprivileged: truehostname: 192.168.44.235environment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |exter…

【PX4_Autopolite飞控源码】中飞控板初始化过程中的引脚IO控制(拉低/拉高)

先选择自己飞控板支持的硬件平台 打开对应的路径我的是Desktop/px4/PX4-Autopilot/boards/zhty/nora 找到board_config.h文件&#xff0c;打开nora后再往下去找Desktop/px4/PX4-Autopilot/boards/zhty/nora/src/borad_config.h 打开后可以看到有很多GPIO引脚的定义&#xff0c…

如何使用Postman优雅地进行接口自动加密与解密

引言 在上一篇文章中&#xff0c;分享了 Requests 自动加解密的方法&#xff0c;本篇文章分享一下更加方便的调试某个服务端接口。 Postman Postman 这个工具后端小伙伴应该相当熟悉了&#xff0c;一般情况下我们会在开发和逆向过程中使用它来快速向接口发送请求&#xff0c;…

Spring Boot——统一功能处理

1. 拦截器 拦截器主要用来拦截用户的请求&#xff0c;在指定方法前后&#xff0c;根据业务需要执行设定好的代码&#xff0c;也就是提前定义一些逻辑&#xff0c;在用户的请求响应前后执行&#xff0c;也可以在用户请求前阻止其执行&#xff0c;例如登录操作&#xff0c;只有登…

PYTORCH基础语法知识

初识Torch PyTorch&#xff0c;简称Torch&#xff0c;主流的经典的深度学习框架&#xff0c;深度学习的框架。 简介 PyTorch是一个基于Python的深度学习框架&#xff0c;它提供了一种灵活、高效、易于学习的方式来实现深度学习模型。PyTorch最初由Facebook开发&#xff0c;被…

C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术

C嘎嘎探索篇&#xff1a;栈与队列的交响&#xff1a;C中的结构艺术 前言&#xff1a; 小编在之前刚完成了C中栈和队列&#xff08;stack和queue&#xff09;的讲解&#xff0c;忘记的小伙伴可以去我上一篇文章看一眼的&#xff0c;今天小编将会带领大家吹奏栈和队列的交响&am…