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

embedded/2024/11/13 9:18:15/

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/embedded/91137.html

相关文章

48天笔试训练错题——day41

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 五子棋 2. Emacs计算器 选择题 1. 当发生拥塞时&#xff0c;TCP 有个机制&#xff0c;会从慢开始进行发送。 1. 把慢开始的门限值设为当前窗口的一半&#xff0c;即 ssthresh 1/2 * 8 4 KB 2. 把拥塞窗…

提升生产效率:APS高级计划排程系统在车间工序级排程的革命性应用

在制造业的数字化转型浪潮中&#xff0c;APS高级计划排程系统以凭借自身卓越的排程运算能力和应用灵活性&#xff0c;已经成为中大型制造业提升生产效率的关键工具。APS系统的介入&#xff0c;打通了传统ERP和MES等各类业务系统运营平台&#xff0c;并且通过产能均衡规划&#…

Sentinel-1 Level 1数据处理的详细算法定义(五)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下: Sentinel-1 L…

flex的css总结,

1、App.vue的<style>中全局阴影 <style> /* 引入flex布局样式 */ import "./styles/flex.css"; </style> 2、编写flex.css文件 charset "UTF-8";.flex {display: -webkit-flex;display: flex; }/*即项目的排列方向*/ .flex-direction…

【Visual Studio Code】源代码管理 传入/传出 更改配置开关

July 2024 (version 1.92)版本更新的Visual Studio Code 增加了 【源代码管理 - 传入/传出】的可视化视图。 但是目前发现也会导致加载变慢 占用页面的影响&#xff0c;如果希望关闭该视图&#xff0c; 可以在设置里搜索 scm.showHistoryGraph 关闭即可

华清IOday7 24-8-5

文章目录 使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&#xff0c;另一个进程收到消息后&#xff0c;展示到终端上&#xff0c;并且将消息保存到文件上一份使用有名管道实现两个进程间相互通信 使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&a…

一文了解K8S(Kubernates)

一、K8S 1. 概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊…

C++新手教程

介绍 C 是一种通用编程语言&#xff0c;支持面向对象编程和泛型编程。它是C语言的扩展&#xff0c;提供了更多的功能和灵活性&#xff0c;由Bjarne Stroustrup于1980年代初开发&#xff0c;最初被称为“C with Classes”&#xff0c;后来改名为C。它被广泛应用于系统/应用程序…