跳到主要内容

🕷 Scrapy:强大的爬虫框架

Scrapy 是 Python 中最强大的爬虫框架之一,适合构建结构化、可扩展的网页抓取项目。它内建异步机制,效率高,适合中大型项目。


✅ Scrapy 解决了什么问题?

使用 requests + BeautifulSoup 虽简单,但:

  • 缺少项目结构管理
  • 无队列调度系统
  • 无法自动限速重试、并发控制
  • 难以维护复杂抓取逻辑

Scrapy 则提供:

  • 🗂 完善项目结构
  • 🔄 高效异步调度与爬取队列
  • 💾 自动保存、导出数据
  • 🧱 扩展中间件、管道处理等模块

⚙ 安装 Scrapy

pip install scrapy

📁 创建 Scrapy 项目

scrapy startproject myspider

创建后结构:

myspider/
├── myspider/
│ ├── __init__.py
│ ├── items.py # 定义要抓取的数据结构
│ ├── middlewares.py # 请求/响应中间件
│ ├── pipelines.py # 数据处理管道
│ ├── settings.py # 项目配置
│ └── spiders/ # 爬虫文件目录
│ └── example.py # 示例爬虫
└── scrapy.cfg # 配置入口文件

🕸 编写一个简单爬虫

spiders/ 下创建 quotes.py

scrapy 导入 Spider

名言爬虫(Spider):
名称 = "名言"
起始网址 = ["https://quotes.toscrape.com"]

定义 解析(self, 响应):
对于 quote响应.css("div.quote"):
yield {
"文本": quote.css("span.text::text").get(),
"作者": quote.css("small.author::text").get(),
}

🚀 运行爬虫

scrapy crawl quotes

💾 保存数据到文件

scrapy crawl quotes -o quotes.json

支持格式:

  • .json
  • .csv
  • .xml
  • .jl(JSON Lines)

🧰 核心概念概览

概念说明
Spider爬虫类,定义要爬哪些页面、如何解析
Item抽象出数据结构(可选)
Pipeline定义抓取后如何处理数据(保存到文件、数据库等)
Selector内建选择器(支持 XPath、CSS)
Downloader Middleware请求/响应钩子处理
Scheduler管理请求队列和去重

🔄 自动翻页爬取

定义 解析(self, 响应):
对于 quote响应.css("div.quote"):
yield {
"文本": quote.css("span.text::text").get(),
"作者": quote.css("small.author::text").get(),
}

下一页 = 响应.css("li.next a::attr(href)").get()
如果 下一页不为空:
yield 响应.跟进(响应.网址加入(下一页), 回调=self.解析)

🔒 避免反爬:自定义 Headers

自定义头 = {
"用户代理": "Mozilla/5.0 ..."
}
yield scrapy.请求(网址,=自定义头)

🔧 配置文件设置(settings.py)

# 并发请求数
CONCURRENT_REQUESTS = 8

# 延迟(防止封 IP)
DOWNLOAD_DELAY = 1

# 禁用 robots.txt 遵守
ROBOTSTXT_OBEY = False

# 默认请求头设置
DEFAULT_REQUEST_HEADERS = {
"User-Agent": "MySpiderBot",
}

📦 管道示例:保存到 JSON 文件

class SaveJsonPipeline:
def process_item(self, item, spider):
with open("quotes.txt", "a", encoding="utf-8") as f:
f.write(str(item) + "\n")
return item

然后在 settings.py 中启用:

ITEM_PIPELINES = {
'myspider.pipelines.SaveJsonPipeline': 300,
}

🧩 适合 Scrapy 的场景

✅ 适合:

  • 多页面深度爬取
  • 动态构造请求队列
  • 大量并发爬取
  • 数据管道清洗与保存

🚫 不适合:

  • JavaScript 渲染页面(建议 Selenium / Playwright)
  • 页面结构频繁变化的网站