第八课:Scrapy框架入门:工业级爬虫开发

server/2025/3/13 19:15:28/

在当今大数据时代,数据抓取已成为信息获取的重要手段。Scrapy作为一个基于Python的开源网络爬虫框架,凭借其高效、灵活的特性,在工业级爬虫开发中占据重要地位。本文将详细介绍Scrapy框架的基本架构、工作流程、关键组件(如Spider类与Item Pipeline)以及中间件机制,并通过一个电商产品爬虫案例,展示如何使用Scrapy框架进行数据抓取。

1. Scrapy架构与工作流程

Scrapy架构

Scrapy框架由多个核心组件组成,包括Engine(引擎)、Scheduler(调度器)、Downloader(下载器)、Spiders(爬虫)、Item Pipeline(项目管道)、Downloader Middlewares(下载器中间件)和Spider Middlewares(爬虫中间件)等。

  • Engine(引擎):负责处理整个系统的数据流和事件,是框架的核心。
  • Scheduler(调度器):接收引擎发送的请求,并按其优先级进行排序、过滤和入队。
  • Downloader(下载器):负责下载网页内容或图片等媒体资源,并传递给后续组件进行处理。
  • Spiders(爬虫):定义爬取逻辑和网页解析规则,解析响应并生成提取结果和新的请求。
  • Item Pipeline(项目管道):负责处理由爬虫从网页中抽取的项目,进行数据清洗、验证和存储。
  • Downloader Middlewares(下载器中间件):位于引擎和下载器之间,处理请求和响应。
  • Spider Middlewares(爬虫中间件):位于引擎和爬虫之间,处理响应输入和请求输出。
工作流程

Scrapy的工作流程大致如下:

  1. 启动爬虫Engine首先向爬虫程序索取第一个需要爬取的URL,并将其交给调度器进行入队处理。
  2. 队列调度:调度器接收请求后,按优先级排序、过滤,并将处理后的请求入队,等待下载器下载。
  3. 执行下载:Engine将调度器发来的请求发送给下载器进行下载,下载过程中会经过下载器中间件处理。
  4. 请求响应:下载器获得网页响应对象后,经过蜘蛛中间件处理,最终将响应对象传递给爬虫程序。
  5. 解析响应:爬虫程序解析响应内容,生成Item或新的请求,并发送给引擎。
  6. 保存数据:引擎将Item转发给项目管道进行数据处理或存储,将新的请求转发给调度器等待下一次调度。
  7. 持续爬取:重复上述步骤,直到调度器中没有更多的请求,爬虫关闭。

2. Spider类与Item Pipeline

Spider类

Spider类是Scrapy中用于定义爬取逻辑和解析规则的组件。每个Spider必须定义一个唯一的名字,并包含以下主要方法:

  • start_requests():生成初始请求,默认使用start_urls中的URL构造Request。
  • parse():处理响应,解析出数据或新的请求,并返回包含Item或Request的可迭代对象。
  • closed():爬虫关闭时调用,用于释放资源。
Item Pipeline

Item Pipeline负责处理爬虫从网页中抽取的Item,进行数据清洗、验证和存储。可以在settings.py中通过ITEM_PIPELINES配置启用多个Pipeline,并设置它们的执行顺序。

3. 中间件机制解析

中间件是Scrapy框架中的一个重要机制,允许开发者在执行特定任务时对请求或响应进行自定义处理。Scrapy提供了下载器中间件和爬虫中间件两种类型:

  • 下载器中间件:位于引擎和下载器之间,处理请求和响应。常用功能包括修改请求头、设置代理、处理重定向、失败重试等。
  • 爬虫中间件:位于引擎和爬虫之间,处理响应输入和请求输出。常用功能包括对请求进行过滤或修改、处理响应数据等。

4. 案例:电商产品爬虫

完整示例代码

以下是一个使用Scrapy框架抓取电商产品信息的示例代码,以淘宝商品为例:

创建项目
scrapy startproject taobao_crawlercd taobao_crawler
定义Item

在items.py中定义要抓取的数据结构:

python">import scrapyclass TaobaoItem(scrapy.Item):# 商品标题title = scrapy.Field()# 商品价格price = scrapy.Field()# 商品销量sales = scrapy.Field()# 商品链接url = scrapy.Field()
编写Spider

在spiders目录下创建taobao_spider.py,并编写爬虫逻辑:

python">import scrapy
from taobao_crawler.items import TaobaoItemclass TaobaoSpider(scrapy.Spider):name = 'taobao'allowed_domains = ['taobao.com']# 请求地址start_urls = ['https://s.taobao.com/search?q=%E9%9B%B6%E9%A3%9F&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306']def parse(self, response):# 查找产品节点信息products = response.css('.m-itemlist .items .item')# 遍历数据for product in products:item = TaobaoItem()item['title'] = product.css('.title a::text').get()item['price'] = product.css('.price strong em::text').get()item['sales'] = product.css('.deal-cnt em::text').get()item['url'] = product.css('.title a::attr(href)').get()yield item# 分页数据处理next_page = response.css('.ui-page-next a::attr(href)').get()if next_page:yield response.follow(next_page, self.parse)
编写Pipeline

在pipelines.py中编写数据处理逻辑,如存储到CSV文件:

python">import csvclass TaobaoCsvPipeline:def open_spider(self, spider):# 写入数据到csv本地储存self.file = open('taobao_products.csv', 'w', newline='', encoding='utf-8')self.writer = csv.writer(self.file)self.writer.writerow(['标题', '价格', '销量', '链接'])def close_spider(self, spider):self.file.close()def process_item(self, item, spider):self.writer.writerow([item['title'], item['price'], item['sales'], item['url']])return item
配置settings.py

在settings.py中启用Pipeline:

python">ITEM_PIPELINES = {'taobao_crawler.pipelines.TaobaoCsvPipeline': 300,
}
运行爬虫

在项目根目录下运行以下命令启动爬虫

scrapy crawl taobao

说明

  • 请求头设置:在实际抓取过程中,可能需要设置合适的请求头(如User-Agent)以模拟浏览器访问,避免被目标网站封禁。
  • 分页抓取:示例中通过response.follow(next_page, self.parse)实现分页抓取。
  • 数据存储:示例中将抓取的数据存储到CSV文件中,也可以根据需要存储到数据库或其他存储系统中。

总结

通过本文的介绍,我们了解了Scrapy框架的基本架构、工作流程、关键组件以及中间件机制,并通过一个电商产品爬虫案例展示了如何使用Scrapy框架进行数据抓取。Scrapy框架的灵活性和高效性为开发者提供了快速构建强大爬虫程序的工具,使数据获取变得更加简单和高效。希望本文对大家学习和使用Scrapy框架有所帮助。

关注我!!🫵 持续为你带来Nodejs相关内容。


http://www.ppmy.cn/server/174700.html

相关文章

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在构建智能 AI 助手时,我们希望模型能够智能地调用工具,以便提供准确的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION,它结合了 ReAct(Reasoning Acting)策略,使得 LLM 可以基于工具的描…

【Python】06、流程控制语句

文章目录 1.条件判断语句1.1 if 语句2. input 函数3.if-else 语句4.if-elif-else 语句 2.循环语句2.1 while语句2.2 while语句练习:2.3 循环嵌套2.4 break和continue 通过流程控制语句,可以改变程序的执行顺序,也可以让指定程序反复执行多次。…

计算机网络——路由器

一、路由器的作用 路由器(Router)是网络层(OSI第三层)的核心设备,承担着跨网络通信的关键任务,主要功能包括: 跨网络数据转发 基于IP地址,在不同网络间选择最优路径传输数据包&…

数字IC后端项目典型问题(2025.03.10数字后端项目问题记录)

小编发现今天广大学员发过来的问题都比较好,立即一顿输出分享给大家(每天都有好多种类的数字后端问题)。后续可能会经常通过这种方式来做分享。其实很多问题都是实际后端项目中经常遇到的典型问题。希望通过这种方式的分享能够帮助到更多需要…

详细介绍ListView_DeleteItem

书籍:《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境:visual studio 2022 内容:【例2.27】支持按Delete键删除某行的列表视图控件 说明:以下内容大部分来自腾讯元宝。 以下是关于**ListView_DeleteItem**函数的详细…

Android Compose: `remember` 与 `ViewModel` 保存数据的优缺点对比

在开发 Android 应用时,管理 UI 状态是一个不可避免的话题。Jetpack Compose 提供了两种常见的方式来保存和管理数据:remember 和 ViewModel。它们各有优缺点,适用于不同的场景。 本文将详细对比这两者在保存数据时的优缺点,帮助…

前端非技术性场景面试题

1.如果给你主导一个项目你会怎么展开工作 我的回答: 当我拿到一个项目的时候我首先会进行需求的收集和分析,给出项目的概要设计,同时根据目前的需求做可行性性分析,做的是技术的可行性分析,可行性分析做完之后&#x…

双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!

2025-03-10 语言更新 模式匹配支持守卫(Pattern Guard) 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式,并且模式守卫为真的情况下才会执行。如果模式守卫为假,则会…