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 爬虫的优势
- 简洁易用:Python 语法简洁,容易上手,非常适合快速开发和原型设计。
- 丰富的库和框架:Python 拥有如 requests、BeautifulSoup、Scrapy 等众多库和框架,大大简化了爬虫开发的工作。
- 强大的社区支持: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 简介
2.2 Scrapy 的特点
2.3 Scrapy 的工作流程
Requests (请求):
爬虫(Spider)生成初始的请求(Requests)并将其提交给引擎(Engine)。 这些请求包括需要爬取的 URL 以及如何处理响应(Response)的回调函数。Scheduler (调度器):
引擎将请求传递给调度器(Scheduler)。
调度器负责管理这些请求,并按优先级将其排列,等待处理。Requests (请求):
调度器将请求交回给引擎,按顺序处理。Downloader Middleware (下载中间件):
请求经过下载中间件(Downloader Middleware)进行预处理。
下载中间件可以在请求发送前添加、修改请求头等操作。Downloader (下载器):
引擎将请求发送给下载器(Downloader),下载器负责向目标网站发送 HTTP 请求并获取响应。 下载器将响应返回给引擎。Response (响应):
响应经过下载中间件进行后处理,然后返回给引擎。 引擎将响应发送给爬虫进行处理。Spiders (爬虫):
爬虫接收到响应后,使用预先定义的回调函数解析响应,提取数据或生成新的请求。 解析后的数据可以直接生成 Items,新的请求会返回给引擎继续处理。Item Pipelines (项目管道):
爬虫生成的 Items 通过引擎传递给项目管道(Item Pipelines)。 项目管道负责处理、清洗、验证、存储这些 Items。
3. Scrapy 的核心组件
在深入学习如何使用 Scrapy 之前,我们先了解一下 Scrapy 的核心组件。
3.1 Spider
Spider 是 Scrapy 中最核心的组件,负责定义爬取逻辑和数据提取规则。每个 Spider 都是一个独立的类,继承自 scrapy.Spider
,并实现一些关键的方法,如 start_requests
和 parse
。
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 之间的工作流。