Python 爬虫入门(八):爬虫工程化及Scrapy简介「详细介绍」

news/2024/12/22 2:55:03/

Python 爬虫入门(八):爬虫工程化及Scrapy简介「详细介绍」

  • 前言
  • 1. Python
    • 1.1 Python 简介
    • 1.2 Python 爬虫的优势
    • 1.3 必须掌握的 Python 基础知识
      • 1.3.1 基本语法
      • 1.3.2. 函数和模块
      • 1.3.3 文件操作
      • 1.3.4 数据处理
      • 1.3.5 类和对象
      • 1.3.6 异常处理
  • 2. Scrapy
    • 2.1 Scrapy 简介
    • 2.2 Scrapy 的特点
    • 2.3 Scrapy 的工作流程
  • 3. Scrapy 的核心组件
    • 3.1 Spider
    • 3.2 Item
    • 3.3 Item Pipeline
    • 3.4 Selector
    • 3.5 Downloader Middleware
    • 3.6 Scheduler
    • 3.7 Engine

前言

欢迎来到“Python 爬虫入门”系列的第八篇文章。本篇文章将系统地介绍如何通过 Scrapy 框架将爬虫工程化,从 Python 与爬虫的关系讲起,详细阐述 Scrapy 框架的工作流程。

1. Python

1.1 Python 简介

Python 是一种高级编程语言,以其简洁的语法和强大的功能而闻名。Python 在数据处理、人工智能、自动化脚本等领域有着广泛的应用。特别是对于爬虫开发,Python 拥有丰富的库和框架,使得爬虫开发变得更加容易。

1.2 Python 爬虫的优势

  1. 简洁易用:Python 语法简洁,容易上手,非常适合快速开发和原型设计。
  2. 丰富的库和框架:Python 拥有如 requests、BeautifulSoup、Scrapy 等众多库和框架,大大简化了爬虫开发的工作。
  3. 强大的社区支持:Python 拥有庞大的开发者社区,遇到问题时可以很容易找到解决方案。

1.3 必须掌握的 Python 基础知识

1.3.1 基本语法

  • 数据类型

    python"># 整数
    num = 10
    # 浮点数
    pi = 3.14
    # 字符串
    greeting = "Hello, World!"
    # 列表
    fruits = ["apple", "banana", "cherry"]
    # 元组
    coordinates = (10.0, 20.0)
    # 字典
    person = {"name": "Alice", "age": 30}
    # 集合
    unique_numbers = {1, 2, 3, 4}
    
  • 控制结构

    python"># if 语句
    if num > 0:print("Positive number")
    else:print("Non-positive number")# for 循环
    for fruit in fruits:print(fruit)# while 循环
    count = 0
    while count < 3:print(count)count += 1# 异常处理
    try:result = 10 / 0
    except ZeroDivisionError:print("Cannot divide by zero")
    finally:print("Execution complete")
    

1.3.2. 函数和模块

  • 函数定义和调用

    python">def greet(name):return f"Hello, {name}!"message = greet("Bob")
    print(message)
    
  • 模块和包

    python"># 导入标准库模块
    import math
    print(math.sqrt(16))# 使用自定义模块
    # my_module.py 文件内容
    def add(a, b):return a + b# main.py 文件内容
    import my_module
    result = my_module.add(5, 3)
    print(result)
    

1.3.3 文件操作

  • 文件读写

    python"># 写入文件
    with open("example.txt", "w") as file:file.write("Hello, File!")# 读取文件
    with open("example.txt", "r") as file:content = file.read()print(content)
    
  • 文件路径操作

    python">from pathlib import Path# 创建路径对象
    path = Path("example.txt")
    # 获取文件名
    print(path.name)
    # 获取文件扩展名
    print(path.suffix)
    

1.3.4 数据处理

  • 字符串操作

    python">text = "  Hello, World!  "
    # 去除空白
    stripped_text = text.strip()
    print(stripped_text)# 字符串分割
    words = stripped_text.split(", ")
    print(words)
    
  • 正则表达式

    python">import repattern = r"\d+"  # 匹配数字
    text = "The year is 2024"
    matches = re.findall(pattern, text)
    print(matches)
    

1.3.5 类和对象

  • 面向对象编程
    python">class Person:def __init__(self, name, age):self.name = nameself.age = agedef greet(self):return f"Hello, my name is {self.name} and I am {self.age} years old."person = Person("Alice", 30)
    print(person.greet())
    

1.3.6 异常处理

  • 错误捕获
    python">try:with open("nonexistent_file.txt", "r") as file:content = file.read()
    except FileNotFoundError:print("File not found")
    except Exception as e:print(f"An error occurred: {e}")
    

2. Scrapy

2.1 Scrapy 简介

  • Scrapy 是一个用于提取网页数据的快速、高效的爬虫框架。它提供了强大的功能和灵活的配置,使得爬虫开发更加系统化和工程化。

  • Scrapy 的设计理念是将爬虫任务拆分成若干独立的组件,每个组件负责不同的任务,通过管道将这些组件连接起来,完成整个爬虫任务。

2.2 Scrapy 的特点

  1. 模块化设计:Scrapy 将爬虫任务分解成多个独立的模块,每个模块负责特定的任务,如请求调度、数据提取、数据存储等。
  2. 高效的异步处理:Scrapy 使用 Twisted 框架实现异步网络请求,提高了爬虫的效率和速度。
  3. 强大的数据提取:Scrapy 提供了强大的选择器(如 XPath、CSS 选择器),方便从网页中提取所需数据。
  4. 灵活的配置:Scrapy 支持多种配置方式,可以根据需求灵活调整爬虫的行为。

2.3 Scrapy 的工作流程

在这里插入图片描述

  1. Requests (请求)
    爬虫(Spider)生成初始的请求(Requests)并将其提交给引擎(Engine)。 这些请求包括需要爬取的 URL 以及如何处理响应(Response)的回调函数。

  2. Scheduler (调度器)
    引擎将请求传递给调度器(Scheduler)。
    调度器负责管理这些请求,并按优先级将其排列,等待处理。

  3. Requests (请求)
    调度器将请求交回给引擎,按顺序处理。

  4. Downloader Middleware (下载中间件)
    请求经过下载中间件(Downloader Middleware)进行预处理。
    下载中间件可以在请求发送前添加、修改请求头等操作。

  5. Downloader (下载器)
    引擎将请求发送给下载器(Downloader),下载器负责向目标网站发送 HTTP 请求并获取响应。 下载器将响应返回给引擎。

  6. Response (响应)
    响应经过下载中间件进行后处理,然后返回给引擎。 引擎将响应发送给爬虫进行处理。

  7. Spiders (爬虫)
    爬虫接收到响应后,使用预先定义的回调函数解析响应,提取数据或生成新的请求。 解析后的数据可以直接生成 Items,新的请求会返回给引擎继续处理。

  8. Item Pipelines (项目管道)
    爬虫生成的 Items 通过引擎传递给项目管道(Item Pipelines)。 项目管道负责处理、清洗、验证、存储这些 Items。

3. Scrapy 的核心组件

在深入学习如何使用 Scrapy 之前,我们先了解一下 Scrapy 的核心组件。

3.1 Spider

Spider 是 Scrapy 中最核心的组件,负责定义爬取逻辑和数据提取规则。每个 Spider 都是一个独立的类,继承自 scrapy.Spider,并实现一些关键的方法,如 start_requestsparse

3.2 Item

Item 是用来定义抓取的数据结构的类。它类似于数据库中的表结构,用于存储爬取到的数据。

3.3 Item Pipeline

Item Pipeline 用于处理和存储抓取到的数据。它是一个独立的模块,负责对 Item 进行处理,例如清洗数据、验证数据和将数据存储到数据库中。

3.4 Selector

Selector 是 Scrapy 提供的数据提取工具,用于从 HTML 或 XML 文档中提取数据。Selector 支持 XPath 和 CSS 选择器两种方式。

3.5 Downloader Middleware

Downloader Middleware 是 Scrapy 中用于处理请求和响应的中间件。它可以在请求发送之前和响应到达之后进行处理,例如添加请求头、处理重定向等。

3.6 Scheduler

Scheduler 是 Scrapy 中用于管理请求队列的组件。它负责将请求添加到队列中,并按照一定的顺序发送请求。

3.7 Engine

Engine 是 Scrapy 的核心引擎,负责协调 Spider、Scheduler、Downloader 和 Item Pipeline 之间的工作流。


http://www.ppmy.cn/news/1506347.html

相关文章

网页版IntelliJ IDEA部署

在服务器部署网页 IntelliJ IDEA 引言 大家好&#xff0c;我是小阳&#xff0c;今天要为大家带来一个黑科技——如何在云端部署和使用WEB版的IntelliJ IDEA&#xff0c;让你在任何地方都可以随心所欲地进行Java开发。这个方法特别适合那些用着老旧Windows电脑&#xff0c;部署…

徐州市委书记宋乐伟一行莅临非凸科技徐州分公司调研

7月23日&#xff0c;徐州市委书记宋乐伟一行莅临非凸科技徐州分公司调研&#xff0c;详细了解非凸科技数智交易产品的生态体系以及AI算力赋能的实践成果&#xff0c;并就相关工作进行了现场指导与交流。 非凸科技徐州分公司位于淮海路经济区金融服务中心云盛大厦&#xff0c;致…

centos上传工具

yum install lrzsz 安装完成之后 作用是 输入 rz 可以本地上传文件

ctfhub文件包含

文件包含 url http://challenge-41cbfbe04828b338.sandbox.ctfhub.com:10800/ 构造url&#xff0c;利用hackabar进行Post data修改测试 http://challenge-41cbfbe04828b338.sandbox.ctfhub.com:10800/?fileshell.txt ctfhubsystem("ls"); ctfhubsystem("ls…

jupyter notebook魔法命令

%xmode 魔法命令来控制异常报告&#xff1a; 输入魔法命令&#xff1a;在 IPython 或 Jupyter Notebook 的一个新单元格中&#xff0c;输入以下命令之一来设置异常报告模式&#xff1a; 切换到 Plain 模式&#xff08;简洁输出&#xff09;&#xff1a; %xmode Plain切换回 Con…

服务器数据恢复—Raid故障导致存储中数据库数据丢失的数据恢复案例

服务器存储数据恢复环境&故障情况&#xff1a; 一台光纤存储中有一组由16块硬盘组成的raid。 该存储出现故障导致数据丢失。RAID中2块盘掉线&#xff0c;还有1块盘smart状态为“警告”。 服务器存储数据恢复过程&#xff1a; 1、通过该存储自带的存储管理软件将当前存储的完…

【C++ 面试 - 基础题】每日 3 题(四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

C语言---指针数组和数组指针,函数指针

指针数组和数组指针 数组指针 指向数组的指针 作用&#xff1a;方便的操作数组中的各种数据 例&#xff1a; int* p arr&#xff1b; int (*p)[5] 指针数组 存放指针的数组 作用&#xff1a;用来存放多个指针 例&#xff1a; int *arr[5] int (*p)[5]和int *p[5]的…