【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 time

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

blocking_example()

输出:

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

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

(二)非阻塞

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

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

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

异步调用示例:

import asyncio

async 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 scrapy

class 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 的世界。熟悉这些模块和配置后,你将不仅能快速构建爬虫项目,还能在复杂场景中灵活应对,实现数据抓取的高效化与专业化。

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

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

相关文章

01 [51单片机 PROTEUS仿真设计]基于温度传感器的恒温控制系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 五个按键,分别为启动按键,则LCD1602显示倒计时,音乐播放 设置按键,可以设置倒计时的分秒,然后加减按键,还有最后一个暂停音乐…

途普科技企业知识中台完成华为昇思MindSpore技术认证

近日,北京途普科技有限公司(以下简称“途普科技”)作为华为昇腾大模型方向的应用软件伙伴,核心产品企业知识中台已成功与华为AI框架昇思MindSpore完成相互兼容性认证。这一成就标志着途普科技在AI领域与华为的合作进一步加深&…

shodan(7)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

MYSQL 表的增删改查(上)

目录 1.新增数据 2.查询数据 一般查询 去重查询 排序查询 关于NULL 条件查询 分页查询 1.新增数据 语法:insert into 表名[(字段1,字段2...)] values (值,值....); 插入一条新数据行,前面指定的列,要与后面v…

海康面阵、线阵、读码器及3D相机接线说明

为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…

Java多线程八股(三)一>多线程环境使用哈希表和ArrayList

目录: 一.多线程环境使用ArrayList: 二.多线程使用哈希表: 一.多线程环境使用ArrayList: 首先我们知道,Vector, Stack, HashTable, 是线程安全的(但是不建议用), 其他的集合类不是线程安全的 ,下面是…

TCP IP协议和网络安全

传输层的两个协议: 可靠传输 TCP 分段传输 建立对话(消耗系统资源) 丢失重传netstat -n 不可靠传输 UDP 一个数据包就能表达完整的意思或屏幕广播 应用层协议(默认端口): httpTCP80 网页 ftpTCP21验证用户身…

Webpack前端工程化进阶系列(二) —— HMR热模块更新(图文+代码)

前言 之前更新过一篇Webpack文章:Webpack入门只看这一篇就够了(图文代码),没想到颇受好评,很快就阅读量就破万了hhh,应读者私信的要求,决定继续更新Webpack进阶系列的文章! 进入今天的主题 —— HMR 热模块替换(HotM…

第三讲 架构详解:“隐语”可信隐私计算开源框架

目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位: 通过可视化产品,降低终端用户的体验和演…

C# 结构体

文章目录 前言一、结构体的定义与基本使用(一)定义结构体(二)结构体的使用示例 二、C# 结构的特点(一)丰富的成员类型(二)构造函数相关限制与特性(三)继承方面…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽)Easyexcel(6-单…

【c语言】文件操作详解 - 从打开到关闭

文章目录 1. 为什么使用文件?2. 什么是文件?3. 如何标识文件?4. 二进制文件和文本文件?5. 文件的打开和关闭5.1 流和标准流5.1.1 流5.1.2 标准流 5.2 文件指针5.3 文件的打开和关闭 6. 文件的读写顺序6.1 顺序读写函数6.2 对比一组…

2024-11-23 队列及顺序存储实现

2.3.1 队列及顺序存储实现 与堆栈类似,队列也是一种受限制的线性表。 其实我们在日常生活中经常会碰到排队。我们来观察一下,什么叫做队列,里面有两个最基本的操作,一个叫做入队,一个叫做出队。也就是你能加入这个队…

卷积神经网络学习记录

目录 神经网络基础定义: 基本组成部分 工作流程 卷积层(卷积定义)【CONV】: 卷积层(Convolutional Layer) 特征提取:卷积层的主要作用是通过卷积核(或滤波器)运算提…

数据结构初阶---复杂度

一、数据结构前言 1.数据结构与算法 数据结构(Data Structure):是计算机组织、存储数据的一种方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入&am…

二叉树的层次遍历

二叉树的层次遍历 题目 https://leetcode-cn.com/problems/binary-tree-level-order-traversal/ 描述 给你一个二叉树,请你返回其按 层次遍历 得到的节点值(即逐层地,从做到右访问所有节点) 代码实现 通过两个数组来交替打印 class Solution(object):def levelOrder

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…

【Linux系统】—— 基本指令(四)

【Linux系统】—— 基本指令(三) 1「find」指令2 「grep」指令2.1 初识「grep」指令2.2 「grep」指令 选项 3 打包压缩基本知识4 「zip / unzip」指令5「tar」命令6 文件互传6.1 Linux 与 Windows 互传6.1.1 Linux向Windows传输6.1.2 Windows向Linux传输…

将django+vue项目发布部署到服务器

1.部署django后端服务 部署架构 1.1 下载依赖插件 pip3.8 freeze > requirements.txt1.2 安装依赖插件 pip3 install -r requirements.txt1.3 安装mysql数据库 apt install mysql-server初始化数据库 CREATE USER admin% IDENTIFIED WITH mysql_native_password BY 123…

网络层协议IP

对于网络层我们直接通过IP协议来了解其内容 一.IP协议 首先我们先来了解几个概念: 主机:配有IP地址,但是不进行路由控制的设备 路由器:配有IP地址,同时进行路由控制的设备 节点:主机和路由器的统称 所以现在…