🌈个人主页:易辰君-CSDN博客
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html
目录
[(二)Scrapy 的设计目标](#(二)Scrapy 的设计目标)
[二、Scrapy 的核心架构](#二、Scrapy 的核心架构)
[(二)Scrapy Engine引擎](#(二)Scrapy Engine引擎)
[(六)Item Pipeline数据管道](#(六)Item Pipeline数据管道)
[(三)创建 Scrapy 项目](#(三)创建 Scrapy 项目)
[(五)配置 Scrapy](#(五)配置 Scrapy)
前言
在大数据时代,网络爬虫已经成为数据收集的重要工具。而 Scrapy 作为一个功能强大且高效的 Python 爬虫框架,以其模块化、异步处理和高度可扩展性,广泛应用于数据挖掘、监控和分析等领域。本指南将从 Scrapy 的基础概念到项目实践,带你全面了解如何搭建和优化一个 Scrapy 爬虫项目,不论是新手还是经验丰富的开发者,都能从中获益。
一、Srapy简介
Scrapy 是一个广泛使用的 Python 爬虫框架,专为高效抓取和处理网络数据而设计。
(一)什么是Srapy
Scrapy 是一个开源的 Python 爬虫框架,用于快速、简单地抓取和提取网页中的数据。它特别适合以下场景:
-
抓取动态生成或复杂结构化的网页数据。
-
实现高性能的并发爬取。
-
清洗和存储提取到的数据。
(二)Scrapy 的设计目标
-
高性能:通过非阻塞的异步 I/O 模型,Scrapy 能够同时处理大量网络请求。
-
模块化:框架组件分工明确,用户可以轻松扩展或替换任意模块。
-
易用性:提供了强大的抽象层,开发者只需关注如何提取数据,Scrapy 会处理底层网络通信和调度。
二、Scrapy 的核心架构
Scrapy 框架的整体架构分为六个模块:Spider爬虫、Scrapy Engine引擎、Downloader下载器、
Scheduler调度器、Middleware中间件和Item Pipeline数据管道,详细如下:
(一)Spider爬虫
爬虫是 Scrapy 的核心组件之一,用于定义如何抓取数据。它主要负责以下任务:
-
生成 HTTP 请求。
-
定义起始 URL(
start_urls
)。 -
编写数据提取逻辑(
parse()
方法)。
示例:
python
import scrapy
class MySpider(scrapy.Spider):
name = "example"
start_urls = ["https://example.com"]
def parse(self, response):
# 提取标题和链接
for link in response.css('a'):
yield {
'title': link.css('::text').get(),
'url': link.attrib['href']
}
(二)Scrapy Engine引擎
Scrapy 的引擎负责框架的主逻辑控制。它的任务包括:
-
调度请求并将其交给下载器。
-
接收下载器返回的响应。
-
将响应传递给 Spider 进行解析。
-
通过调度器维护请求队列。
数据流:
-
Spider 定义的起始请求被发送到 Scheduler(调度器)。
-
调度器从请求队列中取出请求,交给 Downloader(下载器)。
-
下载器获取页面内容并返回 Response。
-
Response 被传递到 Spider 的
parse
方法处理。 -
Spider 生成新的请求或提取的数据。
(三)Downloader下载器
Scrapy 下载器专为高性能网页下载设计,支持以下功能:
-
处理 HTTP/HTTPS 请求。
-
自动处理 Cookies。
-
支持用户代理 和 HTTP Headers 定制。
自定义Headers示例:
python
def start_requests(self):
yield scrapy.Request(
url="https://example.com",
headers={"User-Agent": "CustomUserAgent/1.0"}
)
(四)Scheduler调度器
调度器管理爬虫的请求队列,确保请求按优先级处理并避免重复访问。
-
默认支持 去重机制,确保每个 URL 只被请求一次。
-
自定义优先级:可以通过设置请求的
priority
字段调整请求顺序。
(五)Middleware中间件
中间件是 Scrapy 的扩展机制,位于引擎、下载器和 Spider 之间。
下载中间件
-
修改请求或响应内容。
-
动态设置代理、用户代理等。
示例:动态代理设置
python
class ProxyMiddleware:
def process_request(self, request, spider):
request.meta['proxy'] = "http://proxy_ip:proxy_port"
爬虫中间件
- 负责处理 Spider 输入和输出。
示例:过滤掉特定类型的响应
python
class FilterMiddleware:
def process_spider_output(self, response, result, spider):
for item in result:
if "unwanted" not in item['title']:
yield item
(六)Item Pipeline数据管道
管道处理 Spider 提取的数据,包括:
-
数据清洗:格式化提取的数据。
-
数据验证:检查提取的数据是否完整或符合规范。
-
数据存储:将清洗后的数据存入数据库或文件。
示例:
python
class CleanPipeline:
def process_item(self, item, spider):
item['title'] = item['title'].strip()
return item
三、Scrapy框架的搭建
(一)环境准备
Scrapy 是一个 Python 框架,因此需要提前准备好运行环境:
1.1 安装 Python
-
下载最新稳定版 Python(推荐 3.7 或更高版本)。
-
从 Python 官网 安装,并确保勾选"Add Python to PATH"。
1.2 安装依赖工具
-
Windows 用户需安装 Visual Studio 的 C++ 构建工具以支持依赖包编译。
-
Linux 和 macOS 用户需确保系统安装了开发工具(如
gcc
和libxml2-dev
)。
(二)安装Scrapy
使用 pip 安装
Scrapy 可以通过 pip 一键安装:
python
pip install scrapy
安装完成后,检查是否成功:
python
scrapy --version
输出示例:
python
Scrapy 2.x.x
可能遇到的安装问题及解决办法
-
Windows 下安装失败
- 确保安装了 C++ 构建工具,并安装最新版本。
-
macOS SSL 错误
确保更新 OpenSSL 库:
python
brew install openssl
然后重新安装 Scrapy。
(三)创建 Scrapy 项目
创建项目是使用 Scrapy 的第一步。假设项目名为 myproject
。
创建项目
运行以下命令创建项目:
python
scrapy startproject myproject
执行后,项目结构如下:
python
myproject/
scrapy.cfg # Scrapy 配置文件
myproject/ # 项目代码目录
__init__.py
items.py # 定义数据结构
middlewares.py # 中间件
pipelines.py # 数据管道
settings.py # 项目配置
spiders/ # 存放爬虫代码
__init__.py
(四)编写第一个爬虫
进入项目目录
python
cd myproject
创建爬虫
使用以下命令创建一个名为 example
的爬虫:
python
scrapy genspider example example.com
执行后,会在 spiders/
文件夹中生成爬虫代码:
python
myproject/spiders/example.py
编辑爬虫代码
在 spiders/example.py
中,定义爬取逻辑,例如抓取 example.com
的标题:
python
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example' # 爬虫名称
start_urls = ['https://example.com'] # 起始 URL
def parse(self, response):
# 提取标题并打印
title = response.xpath('//title/text()').get()
yield {'title': title}
(五)配置 Scrapy
Scrapy 的行为可以通过 settings.py
文件进行配置:
基础配置
打开 settings.py
,设置常用参数:
- 日志级别:
python
LOG_LEVEL = 'INFO'
- 下载延迟: 防止被目标站点屏蔽:
python
DOWNLOAD_DELAY = 2 # 每次请求间隔 2 秒
- User-Agent: 模拟浏览器行为:
python
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
数据存储
配置数据导出格式和位置。例如,导出到 JSON 文件:
python
scrapy crawl example -o output.json
(六)运行爬虫
启动爬虫
在项目目录下运行爬虫:
python
scrapy crawl example
运行结果: 如果爬虫正常运行,你将在终端看到标题等提取的数据。
调试爬虫
使用 scrapy shell
测试提取逻辑:
python
scrapy shell 'https://example.com'
进入交互环境后,可以测试 XPath 或 CSS 提取规则:
python
response.xpath('//title/text()').get()
response.css('title::text').get()
(七)高级配置
启用管道
在 pipelines.py
中定义数据存储逻辑,例如将数据存储到 MongoDB:
python
import pymongo
class MongoPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient("localhost", 27017)
self.db = self.client["scrapy_db"]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db["scrapy_collection"].insert_one(dict(item))
return item
启用管道:
python
ITEM_PIPELINES = {
'myproject.pipelines.MongoPipeline': 300,
}
动态页面支持
Scrapy 原生不支持动态 JavaScript 渲染,但可以结合 Selenium 实现:
- 安装
scrapy-selenium
:
python
pip install scrapy-selenium
2.配置 Selenium: 修改 settings.py
:
python
from shutil import which
SELENIUM_DRIVER_NAME = 'firefox'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')
SELENIUM_DRIVER_ARGUMENTS=['-headless']
3.使用 SeleniumRequest:
python
from scrapy_selenium import SeleniumRequest
class JSExampleSpider(scrapy.Spider):
name = "js_example"
def start_requests(self):
yield SeleniumRequest(url="https://example.com", callback=self.parse)
def parse(self, response):
# 解析动态渲染后的页面
title = response.css('title::text').get()
yield {'title': title}
四、总结
Scrapy 凭借其高效的异步架构、灵活的扩展机制和丰富的功能,成为处理网络数据的强大工具。本文从 Scrapy 的核心架构到搭建项目的每一步,都做了详细的说明,为开发者快速掌握该框架提供了清晰的路径。在未来,结合动态渲染支持和分布式扩展,Scrapy 的应用场景将更加广泛。无论你是为了抓取数据还是构建数据驱动型应用,Scrapy 都是一个值得深入学习的框架。