Scrapy 是Python 开发的开源、异步网页爬虫框架,专门用于批量抓取网页数据,自带请求调度、下载、解析、数据持久化、反爬基础处理,不用手写大量请求、队列逻辑,适合大规模爬虫项目。
- 核心五大组件(架构)
| 组件 | 作用 |
|---|---|
| Spider(爬虫) | 写解析逻辑,定义爬取规则、url,提取需要的数据 |
| Item(数据容器) | 定义要抓取的数据字段,类似数据模型,规范输出格式 |
| Item Pipeline(管道) | 拿到解析后的数据,做保存:存 json/csv、存数据库、清洗过滤数据 |
| Downloader(下载器) | 负责发送 http 请求,下载网页源码,处理请求头、代理、重试 |
| Scheduler(调度器) | 管理待爬取 url 队列,去重、调度请求顺序,实现异步并发 |
中间件:
Downloader Middleware:处理请求 / 响应,设置代理、Cookie、UA、处理异常
Spider Middleware:处理 spider 输出的数据、请求
- 安装
pip install scrapy
- 基础命令
创建爬虫项目
scrapy startproject myspider
#进入项目文件夹
cd myspider
#生成爬虫文件 爬虫名 爬取域名
scrapy genspider demo_spider example.com
#运行爬虫
scrapy crawl demo_spider
#导出数据
scrapy crawl demo_spider -o data.json
scrapy crawl demo_spider -o data.csv
- 项目目录结构
plaintext
myspider/
├─myspider/
│ ├─init.py
│ ├─items.py #定义数据字段
│ ├─middlewares.py #中间件
│ ├─pipelines.py #数据处理管道
│ ├─settings.py #爬虫全局配置
│ └─spiders/ #存放各个爬虫文件
│ └─demo_spider.py
└─scrapy.cfg
- 最简示例
spiders/demo_spider.py
import scrapy
class DemoSpider(scrapy.Spider):
name = "demo_spider" #爬虫唯一名字,crawl命令用这个
allowed_domains = "example.com"
start_urls = "https://example.com" #初始url
def parse(self, response):
response 网页响应对象
title = response.xpath("//title/text()").get() #xpath提取
yield {"title":title} #产出数据交给pipeline
parse():默认回调函数,拿到网页 response,做 xpath/css 选择器解析,yield产出数据 / 新请求。
yield scrapy.Request(url,callback=xxx) 生成下一页请求。
xpath /css 选择器
python
运行
#xpath
response.xpath('//div@class="title"/text()').get() #取第一条
response.xpath('//div@class="title"/text()').getall() #全部结果
#css选择器
response.css('div.title::text').get()
- settings.py 常用配置
是否遵守robots协议,正式爬虫关闭
ROBOTSTXT_OBEY = False
#并发请求数,调大爬的快,容易封IP
CONCURRENT_REQUESTS = 16
#请求间隔,防反爬,单位秒
DOWNLOAD_DELAY = 1
#请求头,伪装浏览器
DEFAULT_REQUEST_HEADERS = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}
#开启pipeline
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300, #数字代表执行优先级,越小越先执行
}
- Item & Pipeline 示例
python
运行
import scrapy
class DemoItem(scrapy.Item):
title = scrapy.Field()
python
运行
class MyspiderPipeline:
def process_item(self, item, spider):
#每条数据进来执行,可以写入库逻辑
print(item)
return item
- 优缺点
✅优点
异步架构,并发高,速度远高于 requests 循环
自带 url 去重、重试、调度队列,不用自己写队列
xpath/css 解析开箱即用,完整组件化,适合大批量爬虫
支持导出 json、csv,对接数据库方便
❌缺点
JS 渲染动态页面拿不到数据(需要搭配 Selenium/Playwright)
学习成本高于简单 requests 脚本
调试不如普通脚本直观
如果页面是 JS 渲染:使用 scrapy‑playwright 插件,集成浏览器渲染。
- 常见坑
403 被拦截:需要设置 UA、Cookie、代理、加大 DOWNLOAD_DELAY
中文乱码:scrapy 内部自动处理编码,输出文件乱码在导出时设置编码
url 没有被爬取:检查allowed_domains会过滤域外链接;url 去重机制导致重复 url 不会再次请求
动态网页拿不到内容:scrapy 默认不执行 JS,需要浏览器渲染组件。