Scrapy爬虫框架介绍
目录
什么是Scrapy
Scrapy核心组件
Scrapy扩展组件
组件交互流程
安装Scrapy
Scrapy项目目录结构说明
创建Scrapy项目
创建爬虫
运行爬虫
配置请求头
全局配置请求头
指定爬虫配置请求头
配置管道pipeline
全局配置pipeline
方式一:指定爬虫配置pipeline
方式二:指定爬虫配置pipeline
数据建模 items
Scrapy官网:https://scrapy.org/
什么是Scrapy
Scrapy 是一个基于 Python 的快速的高级网页抓取和网页爬取框架,用于抓取网站并从其页面中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。
Scrapy核心组件
- 1. Scrapy Engine(Scrapy引擎)
- Scrapy 引擎是整个系统的核心,负责控制数据流在所有组件之间的流动。它从调度器获取请求,发送给下载器处理,然后将下载器返回的响应交给爬虫处理。
- 2. Scheduler(调度器)
- 调度器负责接收引擎发来的请求并进行排序,然后将这些请求发送给引擎。调度器可以处理优先级,并且支持去重机制以避免重复抓取。
- 3. Downloader(下载器)
- 下载器负责向互联网上的服务器发送请求,并接收响应。Scrapy 下载器是高度异步的,能够高效地处理大量请求。
- 4. Spiders(爬虫)
- 爬虫是用户定义的类,负责处理下载器返回的响应,从中提取数据(Item)或进一步生成请求。每个爬虫定义了要抓取的域名和处理响应的逻辑。
- 5. Item(数据项)
- Item 是一种简单的数据容器,用于存储从网页中提取的数据。Item 类似于字典,但提供了额外的保护和方法。
- 6. Item Pipeline(数据管道)
- 数据管道是一个序列化系统,用于处理和存储从爬虫中提取的数据。每个管道组件负责处理数据项的一部分,例如数据清洗、验证或存储。
- 7. Downloader Middlewares(下载中间件)
- 下载中间件是介于调度器和下载器之间的钩子,用于处理请求和响应。它们可以修改或扩展请求和响应的处理流程,例如设置代理、修改请求头等。
- 8. Spider Middlewares(爬虫中间件)
- 爬虫中间件是介于引擎和爬虫之间的钩子,用于处理爬虫输入和输出的响应和结果。它们可以修改或扩展爬虫的处理流程,例如添加额外的日志记录、处理异常等。
Scrapy扩展组件
- 1. Feed Exports(数据导出)
- Scrapy 支持将抓取的数据导出为多种格式(如 JSON、CSV、XML),并可以配置导出的细节(如字段顺序、编码等)。
- 2. Telnet Console(Telnet 控制台)
- Telnet 控制台提供了一个实时监控和调试爬虫的工具,允许开发者在爬虫运行时进行交互式调试。
- 3. Logging(日志)
- Scrapy 内置了强大的日志系统,用于记录运行时的各种信息,如调试信息、错误消息等。日志系统可以配置不同的日志级别和输出格式。
- 4. Extensions(扩展)
- 扩展模块用于增强 Scrapy 的功能,例如自动重试失败的请求、监控爬虫性能等。开发者可以自定义扩展模块以满足特定需求。
- 5. Stats Collectors(统计收集器)
- 统计收集器用于收集和记录爬虫运行时的各种统计信息,如请求数量、响应时间等。统计信息可以用于优化和调试爬虫。
组件交互流程

- 初始请求:爬虫从 start_urls 生成初始请求,并通过引擎(Engine)发送给调度器(Scheduler)。
- 请求调度:调度器(Scheduler)将请求排序并发送给下载器(Downloader)。
- 请求下载:下载器(Downloader)向目标网站(Internet)发送请求并获取响应。
- 响应处理:下载器(Downloader)将响应发送给引擎(Engine),进而交给爬虫(Spiders)处理。
- 数据提取:爬虫(Spiders)从响应中提取数据项,并生成新的请求(如果有)。
- 数据处理:提取的数据项通过数据管道(Item Pipeline)进行处理和存储。
安装Scrapy
pip install scrapy
Scrapy项目目录结构说明
Scrapy 项目的结构较为标准,以下是一个典型的 Scrapy 项目的目录结构图示及其简要说明,供方便理解。
myproject/
│
├── myproject/ # 项目目录(主目录)
│ ├── __init__.py
│ ├── items.py # 定义 Item 类(数据结构)
│ ├── middlewares.py # 自定义中间件
│ ├── pipelines.py # Item 处理管道
│ ├── settings.py # 项目设置文件
│ ├── spiders/ # 存放爬虫的目录
│ │ ├── __init__.py
│ │ ├── example_spider.py # 定义爬虫
│
├── scrapy.cfg # Scrapy 配置文件
│
└── README.md # 项目的说明文件(可选)
创建Scrapy项目
使用 scrapy startproject 命令来创建一个新的 Scrapy 项目。打开终端或命令行,进入你想要创建项目的目录,并运行以下命令
# scrapy startproject <项目名称>
scrapy startproject myproject

创建爬虫
在项目根目录中,你可以使用 scrapy genspider 命令创建新的爬虫。以下命令将创建一个名为 baidu 的爬虫,用于抓取 www.baidu.com 的域名
# scrapy genspider <爬虫名称> <允许爬取的域名>
scrapy genspider baidu www.baidu.com

完整目录结构如下

爬虫文件内容说明

解析方法解析response
# 解析方法,response:爬取起始url的响应
def parse(self, response):# 解析示例with open("baidu.html", "wb") as f:f.write(response.body)
运行爬虫
运行爬虫之前需要修改 settings.py 配置文件的配置,如下:

使用 scrapy crawl 命令来运行你的爬虫。以下命令会启动名为 baidu 的爬虫:
# scrapy crawl <爬虫名称>
scrapy crawl baidu

配置请求头
-
全局配置请求头
在 settings.py 配置文件中,配置 USER_AGENT 和 DEFAULT_REQUEST_HEADERS 参数,示例如下:
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "zh-CN,zh;q=0.9",
}
-
指定爬虫配置请求头
在指定爬虫文件中,配置 start_requests 方法,示例如下:
import scrapyclass TeibaSpider(scrapy.Spider):name = "teiba"allowed_domains = ["tieba.baidu.com"]start_urls = ["https://tieba.baidu.com/f?kw=沙井"]def start_requests(self):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36','Accept-Language': 'zh-CN,zh;q=0.9',}for url in self.start_urls:yield scrapy.Request(url, headers=headers, callback=self.parse)def parse(self, response):pass
配置管道pipeline
-
全局配置pipeline
在 settings.py 配置文件中,配置ITEM_PIPELINES 参数用于开启管道,示例如下:
# Configure item pipelines
ITEM_PIPELINES = {# myproject:项目名称# pipelines:项目下的pipelines.py文件# MyprojectPipeline:pipelines.py文件中指定的类# 300:管道优先级,多个管道时,数字越小优先级越高越先执行"myproject.pipelines.MyprojectPipeline": 300,
}
pipelines.py 文件内容如下:

当管道开启后,在我们启动爬虫时,日志打印信息如下:

-
方式一:指定爬虫配置pipeline
在指定爬虫文件中,配置 custom_settings 属性,示例如下:
import scrapyclass TeiBaSpider(scrapy.Spider):name = "teiba"allowed_domains = ["tieba.baidu.com"]start_urls = ["https://tieba.baidu.com/f?kw=沙井"]# 指定 pipelinecustom_settings = {'ITEM_PIPELINES': {'myproject.pipelines.TieBaPipeline': 300,}}def parse(self, response):item = {}item['title='] = a.xpath('./@title').get()item['url='] = "https://tieba.baidu.com/" + a.xpath('./@href').get()# yield 的数据会返回到 TieBaPipeline 中yield item
pipelines.py 文件内容如下:

-
方式二:指定爬虫配置pipeline
在 settings.py 配置文件中,配置 ITEM_PIPELINES 参数配置多个,示例如下:
ITEM_PIPELINES = {"myproject.pipelines.BaiDuPipeline": 300,"myproject.pipelines.TieBaPipeline": 301,
}
在 pipelines.py 文件中通过爬虫名称判断
from itemadapter import ItemAdapterclass BaiDuPipeline:def open_spider(self, spider):# 初始化方法,类比 def __init__(self)if spider.name == "baidu":passdef process_item(self, item, spider):if spider.name == "baidu":passreturn itemdef close_spider(self, spider):# 析构方法,类比 def __del__(self)if spider.name == "baidu":passclass TieBaPipeline:def open_spider(self, spider):if spider.name == "tieba":passdef process_item(self, item, spider):if spider.name == "tieba":passreturn itemdef close_spider(self, spider):if spider.name == "tieba":pass
数据建模 items
数据建模的好处是统一数据字段免得写错,会在执行的时候对模板字段进行检测。清晰代码便于维护等好处。
1. 创建模型
在 items.py 文件中,创建模型
import scrapyclass UserItem(scrapy.Item):# define the fields for your item here like:# 用户名称name = scrapy.Field()# 用户年龄age = scrapy.Field()
2. 爬虫中使用模型
import scrapy
from myproject.items import UserItemclass BaiduSpider(scrapy.Spider):name = "baidu"allowed_domains = ["www.baidu.com"]start_urls = ["https://www.baidu.com"]def parse(self, response):# 使用模型item = UserItem()item['name'] = response.xpath('//h1/text()').get()item['age'] = response.xpath('//h2/text()').get()yield item
3. 管道中使用模型
from itemadapter import ItemAdapterclass MyprojectPipeline:def process_item(self, item, spider):# 把对象类型转换成字典类型item = dict(item)return item
相关文章:
Scrapy爬虫框架介绍
目录 什么是Scrapy Scrapy核心组件 Scrapy扩展组件 组件交互流程 安装Scrapy Scrapy项目目录结构说明 创建Scrapy项目 创建爬虫 运行爬虫 配置请求头 全局配置请求头 指定爬虫配置请求头 配置管道pipeline 全局配置pipeline 方式一:指定爬虫配置pipe…...
Stable Diffusion模型高清算法模型类详解
Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4,分块尺寸768px★★★★★☆皮肤纹理细腻,但高对比场景易出现…...
软考网络安全口诀
首先,我们来看第一个口诀 “防御为先,安全无小事”。这个口诀强调了网络安全中的防御意识。在软考备考过程中,我们需要深刻理解网络安全不仅仅是技术层面的问题,更是一种全面的防御思维。从网络架构设计到日常运维管理࿰…...
Baklib内容中台赋能企业智管
内容中台构建全场景智管 现代企业数字化运营中,全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构,企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例,其利用中台系统将分散在CRM、ERP及内部文档…...
vscode+vue前端开发环境配置
目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后, npm config set registry https://registry.npmmirror.com# 安装vue相关工具,webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…...
Python项目-基于深度学习的校园人脸识别考勤系统
引言 随着人工智能技术的快速发展,深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支,已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...
浅谈C++函数特性
C的函数特性 前言 在C中,函数加入了许多特性,例如:a、函数缺省参数 b、函数重载 c、内联函数 等等……,这里我会和大家详细去探讨这些特性。以及探讨这些特性的一些细节,同时在内联部分,我们还会把C语言的…...
Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)
一、箱图 箱图(Box Plot),又称为箱形图、箱线图、盒式图、盒状图或盒须图,是一种用于展示数据分布情况的统计图表 箱图通过显示数据的中位数、上下四分位数(Q1和Q3)、异常值和数据的分布范围,提…...
高性能PHP框架webman爬虫引擎插件,如何爬取数据
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
【2025年后端开发终极指南:云原生、AI融合与性能优化实战】
一、2025年后端开发的五大核心趋势 1. 云原生架构的全面普及 云原生(Cloud Native)已经成为企业级应用的核心底座。通过容器化技术(DockerKubernetes)和微服务架构,开发者能够实现应用的快速部署、弹性伸缩和故障自愈…...
健康养生:开启活力人生的钥匙
在这个瞬息万变的时代,人们愈发珍视健康。健康养生,宛如一把神奇的钥匙,为我们打开通往活力人生的大门,全方位呵护身心,提升生活品质。 从饮食层面看,均衡膳食是核心。每餐力求包含碳水化合物、蛋白质、脂…...
vue2+ele-ui实践
前言:真理先于实践,实践发现真理,再实践检验真理 环境:vue2 & element-ui 正片: Select 选择器 简称 下拉框 下拉框完整的使用循环 下拉框 → 点击下拉框 → 展示数据 → 选择数据 → 下拉框显示数据 核心具有…...
三维重建(十五)——多尺度(coarse-to-fine)
文章目录 一、多尺度与图像金字塔:从全局结构到局部细节二、特征提取与匹配2.1 从数据采集的角度2.2 从数据增强的角度2.3 从特征提取的方式三、以多尺度的方式使用特征3.1 特征提取与匹配3.1.1 多尺度特征检测3.1.2 金字塔匹配3.2 深度估计与立体匹配3.2.1 多尺度立体匹配3.2…...
SparkStreaming之04:调优
SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示: object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...
勿以危小而为之勿以避率而不为
《故事汇之:所见/所闻/所历/所想》:《公园散步与小雨遇记》(二) 就差一点到山顶了,路上碰到一阿姨,她说等会儿要下大雨了,让我不要往上走了,我犹豫了一会儿,还是听劝地返…...
JavaWeb后端基础(4)
这一篇就开始是做一个项目了,在项目里学习,我主要记录在学习过程中遇到的问题,以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。 GET : 查询 …...
SpringBoot调用DeepSeek
引入依赖 <dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>deepseek-spring-boot-starter</artifactId><version>1.4.5</version> </dependency>配置 deepseek:api-key: sk-******base-url: https://api.…...
记录一下本地部署Dify的坑
1. 截止2025-3-4为止,请注意,不要直接拉Dify的1.0.0版本。请先试用0.15.3版本。1.0.0有一个bug需要解决。[PANIC]failed to init dify plugin db: failed to connect to hostdb userpostgres databasepostgres Issue #14707 langgenius/dify GitHub …...
LC109. 有序链表转换平衡二叉搜索树
LC109. 有序链表转换平衡二叉搜索树 题目要求(一)快慢指针1. 理解问题2. 解决思路3. 具体步骤4. 代码实现5. 复杂度分析6. 示例解释7. 总结 LC109. 有序链表转换平衡二叉搜索树 题目要求 (一)快慢指针 要将一个按升序排列的单链表转换为平衡的二叉搜索树(BST&…...
Hutool一个类型转换工具类 `Convert`,
Hutool 是一个非常实用的Java工具库,旨在简化Java开发中的常见任务。它包含了一个类型转换工具类 Convert,可以帮助开发者轻松地进行各种类型之间的转换。以下是一些使用 Convert 类进行类型转换的例子: 基本类型转换 假设你需要将一个字符…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
