当前位置: 首页 > news >正文

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(统计收集器)
    • 统计收集器用于收集和记录爬虫运行时的各种统计信息,如请求数量、响应时间等。统计信息可以用于优化和调试爬虫。

组件交互流程

  1. 初始请求:爬虫从 start_urls 生成初始请求,并通过引擎(Engine)发送给调度器(Scheduler)。
  2. 请求调度:调度器(Scheduler)将请求排序并发送给下载器(Downloader)。
  3. 请求下载:下载器(Downloader)向目标网站(Internet)发送请求并获取响应。
  4. 响应处理:下载器(Downloader)将响应发送给引擎(Engine),进而交给爬虫(Spiders)处理。
  5. 数据提取:爬虫(Spiders)从响应中提取数据项,并生成新的请求(如果有)。
  6. 数据处理:提取的数据项通过数据管道(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 方式一&#xff1a;指定爬虫配置pipe…...

Stable Diffusion模型高清算法模型类详解

Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4&#xff0c;分块尺寸768px★★★★★☆皮肤纹理细腻&#xff0c;但高对比场景易出现…...

软考网络安全口诀

首先&#xff0c;我们来看第一个口诀 “防御为先&#xff0c;安全无小事”。这个口诀强调了网络安全中的防御意识。在软考备考过程中&#xff0c;我们需要深刻理解网络安全不仅仅是技术层面的问题&#xff0c;更是一种全面的防御思维。从网络架构设计到日常运维管理&#xff0…...

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中&#xff0c;全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构&#xff0c;企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例&#xff0c;其利用中台系统将分散在CRM、ERP及内部文档…...

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后&#xff0c; npm config set registry https://registry.npmmirror.com# 安装vue相关工具&#xff0c;webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…...

Python项目-基于深度学习的校园人脸识别考勤系统

引言 随着人工智能技术的快速发展&#xff0c;深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支&#xff0c;已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...

浅谈C++函数特性

C的函数特性 前言 在C中&#xff0c;函数加入了许多特性&#xff0c;例如&#xff1a;a、函数缺省参数 b、函数重载 c、内联函数 等等……&#xff0c;这里我会和大家详细去探讨这些特性。以及探讨这些特性的一些细节&#xff0c;同时在内联部分&#xff0c;我们还会把C语言的…...

Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)

一、箱图 箱图&#xff08;Box Plot&#xff09;&#xff0c;又称为箱形图、箱线图、盒式图、盒状图或盒须图&#xff0c;是一种用于展示数据分布情况的统计图表 箱图通过显示数据的中位数、上下四分位数&#xff08;Q1和Q3&#xff09;、异常值和数据的分布范围&#xff0c;提…...

高性能PHP框架webman爬虫引擎插件,如何爬取数据

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【2025年后端开发终极指南:云原生、AI融合与性能优化实战】

一、2025年后端开发的五大核心趋势 1. 云原生架构的全面普及 云原生&#xff08;Cloud Native&#xff09;已经成为企业级应用的核心底座。通过容器化技术&#xff08;DockerKubernetes&#xff09;和微服务架构&#xff0c;开发者能够实现应用的快速部署、弹性伸缩和故障自愈…...

健康养生:开启活力人生的钥匙

在这个瞬息万变的时代&#xff0c;人们愈发珍视健康。健康养生&#xff0c;宛如一把神奇的钥匙&#xff0c;为我们打开通往活力人生的大门&#xff0c;全方位呵护身心&#xff0c;提升生活品质。 从饮食层面看&#xff0c;均衡膳食是核心。每餐力求包含碳水化合物、蛋白质、脂…...

vue2+ele-ui实践

前言&#xff1a;真理先于实践&#xff0c;实践发现真理&#xff0c;再实践检验真理 环境&#xff1a;vue2 & element-ui 正片&#xff1a; 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的数量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...

勿以危小而为之勿以避率而不为

《故事汇之&#xff1a;所见/所闻/所历/所想》&#xff1a;《公园散步与小雨遇记》&#xff08;二&#xff09; 就差一点到山顶了&#xff0c;路上碰到一阿姨&#xff0c;她说等会儿要下大雨了&#xff0c;让我不要往上走了&#xff0c;我犹豫了一会儿&#xff0c;还是听劝地返…...

JavaWeb后端基础(4)

这一篇就开始是做一个项目了&#xff0c;在项目里学习&#xff0c;我主要记录在学习过程中遇到的问题&#xff0c;以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中&#xff0c;通过四种请求方式&#xff0c;来操作数据的增删改查。 GET &#xff1a; 查询 …...

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为止&#xff0c;请注意&#xff0c;不要直接拉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. 有序链表转换平衡二叉搜索树 题目要求 (一)快慢指针 要将一个按升序排列的单链表转换为平衡的二叉搜索树&#xff08;BST&…...

Hutool一个类型转换工具类 `Convert`,

Hutool 是一个非常实用的Java工具库&#xff0c;旨在简化Java开发中的常见任务。它包含了一个类型转换工具类 Convert&#xff0c;可以帮助开发者轻松地进行各种类型之间的转换。以下是一些使用 Convert 类进行类型转换的例子&#xff1a; 基本类型转换 假设你需要将一个字符…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...