服务端阅读 05月31日 01:21
Scrapy 框架的核心组件是如何协同工作的?
Scrapy 是 Python 生态里的爬虫框架,解决“怎么稳定抓取一批页面”。如果只是抓一两个静态页面,requests + BeautifulSoup 足够;一旦涉及队列、并发、重试和导出,Scrapy 的价值就明显了。核心链路可以简化成一句话:Spider 产生请求,Scheduler 排队,Downloader 下载页面,Spider 解析响应,Item Pipeline 处理数据,Engine 调度全局。理解链路比背组件名更重要,因为很多问题都发生在边界上。Scrapy 的核心组件怎么分工?Scrapy Engine 是中控层,负责让请求、响应和数据在各组件之间流转。Scheduler 保存待抓取请求,并按去重规则决定哪些请求入队。Downloader 发起网络请求,处理代理、超时、编码和响应返回。Spider 只关心两件事:从响应里提取数据,以及继续生成新的请求。Item Pipeline 则放在数据出口,适合做清洗、校验、去重、入库和导出。一个最小 Spider 大概是这样:import scrapyclass ProductSpider(scrapy.Spider): name = "product" start_urls = ["https://example.com/products"] def parse(self, response): for card in response.css(".product-card"): yield { "name": card.css(".name::text").get(), "price": card.css(".price::text").get(), } next_url = response.css("a.next::attr(href)").get() if next_url: yield response.follow(next_url, callback=self.parse)这段代码只写了 Spider,但调度器、下载器、去重器和管道都已参与工作。Scrapy 的好处就在这里:业务写解析,工程化交给框架。追问Scrapy 和 requests + BeautifulSoup 该怎么选?如果页面数量少、抓取频率低、没有复杂队列,requests + BeautifulSoup 更轻,调试也直观。Scrapy 适合页面规模大、链路长、需要失败重试和持续运行的场景。取舍点主要是工程成本:Scrapy 起步配置多一点,但后期维护更稳。踩坑最多的是“小任务硬上 Scrapy”,最后项目结构比业务还复杂。Scheduler、Downloader 和 Spider 的边界在哪里?Scheduler 不应该关心页面内容,它只负责请求排队和去重。Downloader 不应该写业务解析逻辑,它只负责拿到响应并处理网络层问题。Spider 才是解析 HTML、生成 Item 和下一批 Request 的地方。边界混乱会导致代码难测,比如把字段清洗写进下载中间件,后面换站点时很难复用。Downloader Middleware 和 Item Pipeline 有什么区别?Downloader Middleware 处理的是请求和响应,常见用途是加代理、换 User-Agent、处理 Cookie、识别封禁响应。Item Pipeline 处理的是已经解析出来的数据,适合字段规范化、去重、入库和异常数据丢弃。一个简单判断是:还没拿到页面内容,用中间件;已经拿到结构化字段,用 Pipeline。不要把数据库写入放到中间件里,否则请求失败和数据失败会混在一起。Scrapy 的异步并发是不是越大越好?不是。Scrapy 基于 Twisted 事件循环,可以高并发抓取,但并发过高会带来封禁、超时、数据重复和本机资源耗尽。生产里通常要配合 CONCURRENT_REQUESTS、DOWNLOAD_DELAY、AUTOTHROTTLE_ENABLED 一起调。边界是目标站点的承受能力和反爬策略,不是你的机器能开多少连接。比较稳的做法是先小并发跑通,再根据错误率和响应时间逐步增加。# settings.pyCONCURRENT_REQUESTS = 16DOWNLOAD_DELAY = 0.5AUTOTHROTTLE_ENABLED = TrueAUTOTHROTTLE_TARGET_CONCURRENCY = 4.0RETRY_TIMES = 3ROBOTSTXT_OBEY = TrueScrapy 项目上线后最容易踩什么坑?第一类是选择器太脆,页面结构一改就抓不到字段,所以关键字段要做空值校验和告警。第二类是去重规则没想清楚,带时间戳或追踪参数的 URL 会造成重复抓取。第三类是 Pipeline 入库没有幂等,爬虫重跑后数据重复。Scrapy 提供框架能力,但“抓取是否合法、数据是否可靠、失败是否可恢复”仍要靠项目设计兜底。