F2基于异步的全平台下载工具
🤖 F2 基础功能介绍
F2 是一个 Python 库,提供多平台的作品下载与接口数据处理。支持 DouYin、TikTok、Twitter、WeiBo 等平台.
查看目前支持的应用列表
f2 -h
f2 <apps> [COMMAND] 例如: f2 dy -h
🏖️ 包管理器安装
F2 可单独使用,也可安装到现有项目中。这两种情况下,你都可以使用以下命令选择不同版本安装:
python313 -m pip install f2 # 安装最新版本
python313 -m pip install f2==x.x.x.x # 安装指定版本
python313 -m pip install -U f2 # 更新到最新版本
python313 -m pip uninstall f2 # 卸载⚠️ 收到依赖或其他警告?
- 如果提示
python或pip版本错误,请务必更新到必备条件的版本 Python ≥ 3.10 - 如果你的网络环境缓慢,无法正常访问官方镜像。请使用可以正常访问的第三方镜像源。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple f2🪭 配置文件
🏈 配置文件介绍
F2 配置文件核心由三部分组成: 应用低频/主配置文件(app.yaml)、F2配置文件(conf.yaml)、应用默认配置文件(defaults.yaml)
额外的部分是你的 应用高频/自定义配置文件,它可以涵盖 应用默认配置文件 中的所有参数。
应用低频/主配置文件(app.yaml): 用来保存所有应用不常变动的配置,例如的 cookie、文件名模板、下载路径、连接超时时间、超时重试次数等。
F2配置文件(conf.yaml): 用来保存 F2 的配置,例如不同应用的 计算参数 和 代理。
应用默认配置文件(defaults.yaml): 用来保存各个 app 的初始化默认配置模板,请不要修改与使用它。
配置文件的位置:
python313 -m pip show f2🎳 初始化配置文件
F2 安装完成后,第一步就是运行应用的初始化配置文件命令:
f2 apps --init-config my_apps.yamlf2 dy/douyin --init-config dy.yaml
例如: f2 dy --init-config D:\下载文件\微博_抖音_抓取\DouYin\dy.yaml, 先把应用低频配置文件(app.yaml) 中 cookie 与其他你需要设置的参数配置好。再在其他目录下建立A、B、C用户的专属配置文件,只需配置上低频中没有设置的参数即可douyin:
cover: false
desc: false
folderize: false
interval: all
mode: collects
music: false
url:
https://www.douyin.com/user/MS4wLjABAAAAUVsYIZ4kbElwDmvZ6kXGioaqIIFf-P8_64nSU0DgpZ0🛶 配置Cookie
只需通过 --update-config 命令就可以保存 cookie 到主配置文件中,或者使用 --auto-cookie 命令自动从浏览器获取.
f2 dy -k "从浏览器中复制的cookie" -c app.yaml --update-configf2 dy -c app.yaml --auto-cookie chrome
自动从浏览器获取 cookie,使用该命令前请确保关闭所选的浏览器。🎧 命令行指引
以 douyin 为例, 这里介绍了各参数的配置说明
🔭 执行抓取
f2 dy -c D:\下载文件\微博_抖音_抓取\DouYin\dy.yaml

🎮 批量采集发布视频
💿 python脚本示例代码 batch-posts.py
import asyncio
import traceback
from f2.apps.douyin.handler import DouyinHandler
from f2.apps.douyin.db import AsyncUserDB
from f2.apps.douyin.dl import DouyinDownloader
from f2.utils.conf_manager import ConfigManager
from f2.cli.cli_console import RichConsoleManager
from f2.log.logger import logger
# 全局配置参数,保护敏感信息
kwargs = {
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0",
"Referer": "https://www.douyin.com/",
},
"proxies": {"http://": None, "https://": None},
# 指定模式
"mode": "post",
} | ConfigManager("C:/Users/QING/AppData/Local/Programs/Python/Python313/Lib/site-packages/f2/conf/app.yaml").get_config("douyin")
# 实例化下载器和处理器
dydownloader = DouyinDownloader(kwargs)
dyhandler = DouyinHandler(kwargs)
# 批量采集的用户ID
sec_user_ids = [
"MS4wLjABAAAAUVsYIZ4kbElwDmvZ6kXGioaqIIFf-P8_64nSU0DgpZ0", # Myself
"MS4wLjABAAAACcFu8I8BJyJlLfVGAcFVyoHFP8xsu41b-offhR_xlCg", # 李韩佳捷
]
async def download_post(sec_user_id: str):
"""
下载单个用户的所有作品
Args:
sec_user_id (str): 用户ID
"""
try:
logger.debug(
f"[bold green]开始下载用户ID:{sec_user_id} 的作品...[/bold green]"
)
async with AsyncUserDB("douyin_users.db") as audb:
user_path = await dyhandler.get_or_add_user_data(kwargs, sec_user_id, audb)
async for aweme_list in dyhandler.fetch_user_post_videos(
sec_user_id=sec_user_id
):
if not aweme_list:
logger.info(
f"[bold yellow]无法获取用户作品信息:[/bold yellow] {sec_user_id}"
)
return
await dydownloader.create_download_tasks(
kwargs, aweme_list._to_list(), user_path
)
logger.info(f"[bold green]用户ID:{sec_user_id} 作品下载完成。[/bold green]")
except Exception as e:
logger.error(f"[bold red]用户ID:{sec_user_id} 下载失败:{e}[/bold red]")
async def main():
"""
主函数,批量启动作品下载任务
"""
logger.info("[bold blue]开始批量下载多个用户的作品[/bold blue]")
semaphore = asyncio.Semaphore(kwargs.get("max_tasks", 5))
async def limited_download(sec_user_id):
async with semaphore:
# await download_post(sec_user_id) #
while True:
await download_post(sec_user_id)
await asyncio.sleep(1 * 60 * 60)
# 使用RichConsoleManager管理进度条
with RichConsoleManager().progress:
tasks = [
asyncio.create_task(limited_download(sec_user_id))
for sec_user_id in sec_user_ids
]
await asyncio.gather(*tasks)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info("[bold yellow]程序已手动停止[/bold yellow]")
except Exception as e:
logger.error(f"[bold red]程序运行时出现异常: {e}[/bold red]")
logger.error(traceback.format_exc())
🍜 常见原因和排查建议如下:
cookie 必须为登录态且完整:抖音“喜欢”页面的接口对 cookie 要求更高,建议用浏览器登录后,确保复制的是完整的 cookie,且不要有换行、空格等格式问题。可以尝试用 --auto-cookie 选项自动获取,注意获取前要关闭浏览器进程,避免读取失败。
IP 风控或代理问题:如果你的 IP 被抖音风控,接口会返回 200 但内容为空或失败。可以尝试切换网络环境或不用代理,或更换出口 IP。
cookie 失效或被登出:有时 cookie 虽然能下载公开视频,但访问“喜欢”接口时会被判定为未登录或权限不足。建议重新获取一次 cookie,优先用扫码或账号密码登录后的 cookie。
URL 格式问题:https://www.douyin.com/user/self?... 这种 URL 可能无法直接获取 sec_user_id,建议用自己的主页 URL(如 https://www.douyin.com/user/xxxxxx,xxxxxx 是 sec_user_id),而不是 “self” 这种特殊路径。
配置文件问题:确保配置文件中的 cookie 字段没有格式错误,且长度足够(抖音 cookie 通常有 60+ 个键值对),不要有多余的空格或换行。
