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

🌈个人主页:易辰君-CSDN博客

🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、阻塞和非阻塞

(一)阻塞

(二)非阻塞

二、Scrapy的工作流程

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

(一)Engine引擎

(二)Scheduler调度器

(三)Downloader下载器

(四)Spider爬虫

[(五)Item Pipeline数据管道](#(五)Item Pipeline数据管道)

[(六)Downloader Middlewares下载中间件](#(六)Downloader Middlewares下载中间件)

[(七)Spider Middlewares爬虫中间件](#(七)Spider Middlewares爬虫中间件)

(八)Extensions扩展

(九)Item数据对象

(十)Signals信号

四、Scrapy的入门使用

[(一)安装 Scrapy](#(一)安装 Scrapy)

[(二)创建 Scrapy 项目](#(二)创建 Scrapy 项目)

(三)编写爬虫

(四)运行爬虫

(五)保存数据

(六)常见配置修改

(七)调试与扩展

五、总结


前言

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


一、阻塞和非阻塞

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

(一)阻塞

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

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

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

示例:

python 复制代码
import time

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

blocking_example()

输出:

bash 复制代码
任务开始
(等待2秒)
任务完成

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

(二)非阻塞

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

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

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

异步调用示例:

python 复制代码
import asyncio

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

asyncio.run(non_blocking_example())

输出:

python 复制代码
任务开始
(任务等待中,但主线程未阻塞)
任务完成

在爬虫中,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 安装:

python 复制代码
pip install scrapy

确认安装成功:

python 复制代码
scrapy --version

(二)创建 Scrapy 项目

创建一个新的项目:

python 复制代码
scrapy startproject myproject

项目结构:

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

(三)编写爬虫

进入项目目录:

bash 复制代码
cd myproject

创建爬虫:

bash 复制代码
scrapy genspider example example.com

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

python 复制代码
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(),
            }

(四)运行爬虫

执行命令运行爬虫:

python 复制代码
scrapy crawl example

(五)保存数据

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

python 复制代码
scrapy crawl example -o output.json

(六)常见配置修改

修改 settings.py

python 复制代码
DOWNLOAD_DELAY = 2

启用 User-Agent:

python 复制代码
USER_AGENT = 'myproject (+http://www.example.com)'

(七)调试与扩展

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

python 复制代码
scrapy shell 'http://quotes.toscrape.com'

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

五、总结

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

相关推荐
夏子曦11 分钟前
java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC
java·开发语言
Thomas_YXQ18 分钟前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d
MYBOYER22 分钟前
Kotlin DSL Gradle 指南
android·开发语言·kotlin
武昌库里写JAVA27 分钟前
SpringCloud+SpringCloudAlibaba学习笔记
java·开发语言·算法·spring·log4j
夏天吃哈密瓜29 分钟前
用Scala来解决成绩排名的相关问题
开发语言·后端·scala
subject625Ruben30 分钟前
代码美学:MATLAB制作渐变色
开发语言·matlab
IRevers40 分钟前
使用Python和Pybind11调用C++程序(CMake编译)
开发语言·c++·人工智能·python·深度学习
cdut_suye1 小时前
C++11新特性探索:Lambda表达式与函数包装器的实用指南
开发语言·数据库·c++·人工智能·python·机器学习·华为
weixin_543662861 小时前
BERT的中文问答系统36-1
人工智能·python·bert
weixin_431470861 小时前
人名分类器(nlp)
人工智能·pytorch·python·深度学习·自然语言处理