柳嘉希

硕士研究生毕业生

软件工程师 | 可扩展的API · 网络爬虫 · 数据集成 · Vibe代码清理专家

Scrapy 复习:Engine、Scheduler、Downloader、Spider、Pipeline 与 Selector

Scrapy 不是一个简单的 HTML 解析库,而是完整的爬虫框架。它负责请求调度、下载、解析、数据管道和中间件扩展。

核心组件

Scrapy Engine 负责协调各组件。

Scheduler 接收 Request,排序入队,并在引擎需要时交还请求。

Downloader 负责发送请求并返回 Response。

Spider 负责解析 Response,提取 Item 和新的 URL。

Item Pipeline 负责清洗、过滤、保存数据。

Middleware 可以拦截请求和响应,适合加代理、User-Agent、Cookie 或接入浏览器渲染。

运行流程

  1. Spider 给出初始 URL。
  2. Engine 把 Request 交给 Scheduler。
  3. Scheduler 排队。
  4. Engine 从 Scheduler 取 Request。
  5. Downloader 下载页面。
  6. Response 交给 Spider。
  7. Spider 提取 Item 和新 Request。
  8. Item 进入 Pipeline,新 Request 回到 Scheduler。
  9. 队列为空时爬虫结束。

Selector

Scrapy 使用 Selector 解析 HTML/XML。

def parse(self, response):
    title = response.xpath("//title/text()").get()

XPath 常用写法:

//tag
//div[@class="content"]
//a/@href
//h1/text()
//ul/li[position()=1]

CSS 选择器:

title = response.css("title::text").get()
links = response.css("a::attr(href)").getall()

get 与 getall

.get() 获取第一个匹配结果。

title = response.xpath("//title/text()").get()

.getall() 获取全部结果。

tags = response.css("a.tag::text").getall()

分页

def parse(self, response):
    for quote in response.css("div.quote"):
        yield {
            "text": quote.css("span.text::text").get(),
            "author": quote.css("small.author::text").get(),
        }
 
    next_page = response.css("li.next a::attr(href)").get()
    if next_page:
        yield response.follow(next_page, self.parse)

工具选择

优先级一般是:

  1. 静态 HTML:Scrapy XPath/CSS
  2. 页面内 JSON:直接解析 JSON
  3. 轻微 JS:scrapy-playwright
  4. 强交互页面:Selenium
  5. HTML 结构很脏:BeautifulSoup 辅助清洗

Scrapy 的价值在于框架化、可扩展和适合大规模抓取。