Scrapy 不是一个简单的 HTML 解析库,而是完整的爬虫框架。它负责请求调度、下载、解析、数据管道和中间件扩展。
核心组件
Scrapy Engine 负责协调各组件。
Scheduler 接收 Request,排序入队,并在引擎需要时交还请求。
Downloader 负责发送请求并返回 Response。
Spider 负责解析 Response,提取 Item 和新的 URL。
Item Pipeline 负责清洗、过滤、保存数据。
Middleware 可以拦截请求和响应,适合加代理、User-Agent、Cookie 或接入浏览器渲染。
运行流程
- Spider 给出初始 URL。
- Engine 把 Request 交给 Scheduler。
- Scheduler 排队。
- Engine 从 Scheduler 取 Request。
- Downloader 下载页面。
- Response 交给 Spider。
- Spider 提取 Item 和新 Request。
- Item 进入 Pipeline,新 Request 回到 Scheduler。
- 队列为空时爬虫结束。
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)工具选择
优先级一般是:
- 静态 HTML:Scrapy XPath/CSS
- 页面内 JSON:直接解析 JSON
- 轻微 JS:scrapy-playwright
- 强交互页面:Selenium
- HTML 结构很脏:BeautifulSoup 辅助清洗
Scrapy 的价值在于框架化、可扩展和适合大规模抓取。