feapder

2026-01-09

python

少壮不努力,老大徒伤悲。——《汉乐府长歌行》

来点“实战派”的框架分享:feapder。它是一个上手简单、功能强大的 Python 爬虫框架,内置四类爬虫以应对不同场景,还支持断点续爬、监控报警、浏览器渲染、海量数据去重,更有配套的爬虫管理系统 feaplat 方便部署与调度。项目主页:Boris-code/feapder;官方文档与平台入口都在这儿:feapder.com

一句话摘自仓库 README 的官方介绍:

  • feapder 是一款上手简单、功能强大的 Python 爬虫框架,内置 AirSpider、Spider、TaskSpider、BatchSpider 四种爬虫解决不同场景的需求
  • 支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能
  • 爬虫管理系统 feaplat 为其提供方便的部署及调度

想象一下你的日常爬虫痛点

  • 写一个小爬虫很容易,但一旦涉及断点续传、渲染页面、去重和告警,扩展成本马上上升
  • 不同任务类型需要不同执行模型,有时想要“快跑”的轻量爬虫,有时又需要批量/任务队列式的稳态执行
  • 数据量一大,“去重”就变成头等难题:BloomFilter?Redis?内存?时效性?永久性?性能与成本如何拿捏?
    feapder 的回答是“模块化 + 多场景覆盖 + 工程化落地”,再加一个管理平台把部署与调度从命令行解放出来。

项目状态与生态(来自仓库元信息与 README)

仓库里的主要内容(节选)

为什么它“工程感”很强

  • 四种爬虫类型内置,按需选择:
    • AirSpider:轻量快速启动,适合小任务或快速验证
    • Spider / TaskSpider / BatchSpider:在任务模型、批量处理、调度编排上给到不同能力边界(具体用法以官方文档为准)
  • 断点续爬:长跑任务必备
  • 监控报警:生产化必备(失败/重试/异常预警)
  • 浏览器渲染:应对动态页面(安装“渲染版”或“完整版”,详见下文)
  • 海量数据去重:Dedup 组件内置多种策略(临时/内存/永久),适合不同数据量与时效性场景
  • 配套管理系统 feaplat:部署调度更顺手

如何安装(来自 README)

  • 精简版(不含浏览器渲染、基于内存去重、Mongo 入库)

    1
    pip install feapder
  • 浏览器渲染版(不含基于内存去重、Mongo 入库)

    1
    pip install "feapder[render]"
  • 完整版(支持所有功能)

    1
    pip install "feapder[all]"

    如果完整版安装报错,README 提示参考安装问题文档(docs/question/安装问题),或直接看官网文档的安装章节。

一分钟跑起来(来自 README 的“小试一下”)

1
2
# 创建一个爬虫
feapder create -s first_spider

生成的示例代码大致如下(AirSpider 快速起步):

1
2
3
4
5
6
7
8
import feapder

class FirstSpider(feapder.AirSpider):
def start_requests(self):
yield feapder.Request("https://www.baidu.com")

def parse(self, request, response):
print(response)

这个“最小可跑”的例子很适合验证环境与快速熟悉 API。AirSpider 就是“轻量快跑”的一类爬虫。

重头戏:海量数据去重 Dedup(来自 feapder/dedup/README.md)
Dedup 是 feapder 的大数据去重模块,提供三种机制,使用方式一致,容量与内存相关。不同于固定槽位的 BloomFilter,这里强调“弹性去重机制”,可以容纳海量数据。

  • 临时去重(ExpireFilter,基于 Redis,有时效性,支持批量)
    • 性能参考:去重一万条约 0.26 秒;一亿条约占用内存 1.43G(文档给出的数据)

      1
      from feapder.dedup import Dedup

data = {“xxx”: 123, “xxxx”: “xxxx”}
datas = [“xxx”, “bbb”]

def test_ExpireFilter():
dedup = Dedup(
Dedup.ExpireFilter, expire_time=10, redis_url=“redis://@localhost:6379/0”
)

# 逐条去重
assert dedup.add(data) == 1
assert dedup.get(data) == 1

# 批量去重
assert dedup.add(datas) == [1, 1]
assert dedup.get(datas) == [1, 1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 内存去重(MemoryFilter,支持批量)
- 性能参考:去重一万条约 0.5 秒;一亿条约占用内存约 285MB
```python
from feapder.dedup import Dedup

data = {"xxx": 123, "xxxx": "xxxx"}
datas = ["xxx", "bbb"]

def test_MemoryFilter():
dedup = Dedup(Dedup.MemoryFilter)

# 逐条去重
assert dedup.add(data) == 1
assert dedup.get(data) == 1

# 批量去重
assert dedup.add(datas) == [1, 1]
assert dedup.get(datas) == [1, 1]
  • 永久去重(BloomFilter on Redis,支持批量)
    • 性能参考:去重一万条约 3.5 秒;一亿条约占用内存约 285MB

      1
      from feapder.dedup import Dedup

datas = {
“xxx”: “xxx”,
“xxxx”: “xxxx”,
}

dedup = Dedup()

print(dedup) # <ScalableBloomFilter: RedisBitArray: dedup:bloomfilter:bloomfilter>
print(dedup.add(datas)) # 0 不存在
print(dedup.get(datas)) # 1 存在


你可能会问:到底选哪种?

- 临时去重:适合短期任务/窗口期重复控制,Redis 便于横向扩展
- 内存去重:速度不错,适合单机中等规模;注意内存规划
- 永久去重:强调“历史记忆”,适合长期项目与持久去重需求(BloomFilter 在误判与空间上的权衡需结合业务容忍度)

额外“工程实践”建议

- 把“断点续爬 + 去重 + 告警”作为生产化的最小闭环;先用精简版试跑,动态页面再换 render 或 all
- 明确任务类型:AirSpider 做快跑,Task/Batch 做稳态调度;观察队列与并发开销
- 将 Dedup 参数(Redis 地址、过期时间、内存阈值等)配置化,便于灰度试运行
- 引入监控:任务成功率、请求延迟、渲染失败率、去重命中率、重试次数、异常类型分布
- 用 feaplat 管理系统做“任务编排 + 部署 + 定时 + 观察”,减少手工维护成本

常见路径与文档入口(来自 README 与 docs)

- 官方文档:https://feapder.com
- 仓库主页:https://github.com/Boris-code/feapder
- Releases(更新日志):https://github.com/Boris-code/feapder/releases
- 爬虫管理系统(feaplat):http://feapder.com/#/feapder_platform/feaplat
- Dedup 说明(仓库内):feapder/dedup/README.md
- 模板示例(项目模板):feapder/templates/project_template/README.md

最后的小提示

- 本文严格基于仓库的 README 与 description、以及已检索到的目录/文件撰写,避免乱编
- 由于一次性接口返回内容有限,本文内的文件清单可能不完整;建议直接浏览 GitHub 文件视图获取更全面信息:https://github.com/Boris-code/feapder/tree/master
- License 标注为“Other”,请以仓库的 LICENSE 文件为准
- Python 版本与安装细节以官方 README/官网为准,如遇安装问题参考 docs/question/安装问题 或官网对应章节

如果你正准备把“脚本级爬虫”升级为“生产级爬虫”,feapder 值得跑一遍。先用 AirSpider 快速起步,再把 Dedup 与告警接上,等稳定下来后引入渲染与调度系统,基本就能从“个人脚本”走向“可维护的抓取服务”。祝你抓取顺利,数据干净,报警只在你希望它响的时候响。