在当今大数据时代,数据抓取已成为信息获取的重要手段。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的工作流程大致如下:
- 启动爬虫:Engine首先向爬虫程序索取第一个需要爬取的URL,并将其交给调度器进行入队处理。
- 队列调度:调度器接收请求后,按优先级排序、过滤,并将处理后的请求入队,等待下载器下载。
- 执行下载:Engine将调度器发来的请求发送给下载器进行下载,下载过程中会经过下载器中间件处理。
- 请求响应:下载器获得网页响应对象后,经过蜘蛛中间件处理,最终将响应对象传递给爬虫程序。
- 解析响应:爬虫程序解析响应内容,生成Item或新的请求,并发送给引擎。
- 保存数据:引擎将Item转发给项目管道进行数据处理或存储,将新的请求转发给调度器等待下一次调度。
- 持续爬取:重复上述步骤,直到调度器中没有更多的请求,爬虫关闭。
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中定义要抓取的数据结构:
import scrapyclass TaobaoItem(scrapy.Item):# 商品标题title = scrapy.Field()# 商品价格price = scrapy.Field()# 商品销量sales = scrapy.Field()# 商品链接url = scrapy.Field()
编写Spider
在spiders目录下创建taobao_spider.py,并编写爬虫逻辑:
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文件:
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:
ITEM_PIPELINES = {'taobao_crawler.pipelines.TaobaoCsvPipeline': 300,
}
运行爬虫
在项目根目录下运行以下命令启动爬虫:
scrapy crawl taobao
说明
- 请求头设置:在实际抓取过程中,可能需要设置合适的请求头(如User-Agent)以模拟浏览器访问,避免被目标网站封禁。
- 分页抓取:示例中通过response.follow(next_page, self.parse)实现分页抓取。
- 数据存储:示例中将抓取的数据存储到CSV文件中,也可以根据需要存储到数据库或其他存储系统中。
总结
通过本文的介绍,我们了解了Scrapy框架的基本架构、工作流程、关键组件以及中间件机制,并通过一个电商产品爬虫案例展示了如何使用Scrapy框架进行数据抓取。Scrapy框架的灵活性和高效性为开发者提供了快速构建强大爬虫程序的工具,使数据获取变得更加简单和高效。希望本文对大家学习和使用Scrapy框架有所帮助。
关注我!!🫵 持续为你带来Nodejs相关内容。