Scrapy 命令行工具完全解析:scrapy.cfg 配置、全部内置命令与自定义命令实现
Scrapy 的几乎所有操作都通过 scrapy 命令行工具完成:创建项目、生成爬虫、启动抓取、调试页面、查看配置、运行基准测试。本文以官方文档 Command line tool 为主线,完整覆盖 scrapy 工具的配置加载机制、项目目录结构、全部 14 个内置命令(全局命令与项目命令)的参数用法,并结合 scrapy/cmdline.py 与 scrapy/commands 目录下的源码,剖析命令的发现、解析与执行流程,以及 ScrapyCommand 基类如何支撑自定义命令扩展。读完后你可以独立完成从 scrapy startproject 到 scrapy crawl 的完整工作流,并能编写项目级自定义命令。
scrapy.cfg 配置体系与查找顺序
scrapy 工具启动后,首先会按固定优先级在标准位置查找 ini 风格的 scrapy.cfg 文件:
/etc/scrapy.cfg或c:\scrapy\scrapy.cfg(系统级,全机器生效);~/.config/scrapy.cfg(即$XDG_CONFIG_HOME)与~/.scrapy.cfg(即$HOME),用于全局(用户级)配置;- Scrapy 项目根目录内的
scrapy.cfg。
三者按上述顺序合并:用户自定义值优先于系统级默认值,而项目级配置一旦定义则覆盖其余两者。项目级 scrapy.cfg 的最小内容形如:
[settings]
default = myproject.settings
其中 default 指定了项目的 settings 模块路径。这个机制的模板来源是 scrapy/templates/project/scrapy.cfg,scrapy startproject 创建项目时渲染的就是它。
除 scrapy.cfg 外,Scrapy 还通过三个环境变量接受配置:
| 环境变量 | 作用 |
|---|---|
SCRAPY_SETTINGS_MODULE |
指定 settings 模块(见 settings 文档) |
SCRAPY_PROJECT |
指定使用哪个项目别名(详见下文“多项目共享根目录”) |
SCRAPY_PYTHON_SHELL |
指定 scrapy shell 使用的交互式 shell(见 shell 文档) |
多项目共享同一根目录
一个包含 scrapy.cfg 的项目根目录可以被多个 Scrapy 项目共享,每个项目拥有独立的 settings 模块。此时需要在 scrapy.cfg 的 [settings] 段中为各 settings 模块定义别名:
[settings]
default = myproject1.settings
project1 = myproject1.settings
project2 = myproject2.settings
默认情况下 scrapy 使用 default 指向的设置;通过 SCRAPY_PROJECT 环境变量可以切换到其他项目:
$ scrapy settings --get BOT_NAME
Project 1 Bot
$ export SCRAPY_PROJECT=project2
$ scrapy settings --get BOT_NAME
Project 2 Bot
Scrapy 项目的默认目录结构
在深入各子命令之前,先明确项目结构。Scrapy 项目默认结构如下:
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
...
scrapy.cfg 所在目录称为项目根目录(project root directory),许多命令“必须在项目内运行”正是以该目录为判定基准——这一点在 scrapy/cmdline.py 的 execute() 中由 inside_project() 函数实现,命令是否可用(requires_project)就取决于此。
几个容易混淆的命名关系值得注意:
SPIDER_MODULES和NEWSPIDER_MODULE默认引用项目模块本身,因此必须与其实际位置匹配,scrapy list、scrapy genspider、scrapy crawl都依赖它们来定位爬虫;BOT_NAME默认与项目同名,但它只是一个标识符,不要求等于模块名;middlewares.py、pipelines.py中类名使用“大写项目名”作前缀(如MyprojectDownloaderMiddleware)仅是命名约定,与模块名是否一致无关。
上述结构由 scrapy/templates/project 模板目录生成,其中 settings.py.tmpl、items.py.tmpl、pipelines.py.tmpl、middlewares.py.tmpl 在创建项目时被逐一渲染(见 scrapy/commands/startproject.py 中的 TEMPLATES_TO_RENDER)。
使用 scrapy 工具:帮助输出与全局选项
不带任何参数运行 scrapy,会打印版本、当前激活的项目、用法说明和可用命令列表:
Scrapy X.Y - no active project
Usage:
scrapy <command> [options] [args]
Available commands:
fetch Fetch a URL using the Scrapy downloader
runspider Run a spider from a Python file, no project required
[...]
第一行若在项目内运行,会显示 Scrapy X.Y - project: myproject。这一输出由 scrapy/cmdline.py 中的 _print_header() 与 _print_commands() 生成:项目外运行时还会额外提示 [ more ] More commands available when run from project directory。
查看单个命令的完整帮助:
scrapy <command> -h
查看所有命令:
scrapy -h
从源码看,每个命令在 scrapy <command> -h 时都会注册一组全局选项(定义于 scrapy/commands/init.py 的 ScrapyCommand.add_options()),它们对所有内置命令统一可用:
| 选项 | 作用 |
|---|---|
--logfile FILE |
指定日志文件;省略时写 stderr |
-L, --loglevel LEVEL |
设置日志级别(默认取 LOG_LEVEL 设置值) |
--nolog |
完全禁用日志 |
--profile FILE |
将 cProfile 性能统计写入文件(见 scrapy/cmdline.py 的 _run_command_profiled) |
--pidfile FILE |
将当前进程 PID 写入文件 |
-s, --set NAME=VALUE |
设置/覆盖设置项,可重复使用 |
--pdb |
出错时进入 pdb 调试(若安装了 ipdb 则用 ipdb) |
-s 选项以 priority="cmdline" 写入 settings,即优先级高于项目与爬虫级别的设置(解析逻辑在 ScrapyCommand.process_options(),见 scrapy/commands/init.py)。
创建与操控项目
startproject:创建项目
语法:scrapy startproject <project_name> [project_dir](全局命令,无需项目)。
在 project_dir 下创建名为 project_name 的项目;若未指定 project_dir,则与 project_name 同名。
$ scrapy startproject myproject
cd myproject
创建完成即可在该目录中使用 scrapy 命令管理项目。源码层面(scrapy/commands/startproject.py)还有几条约束:
- 项目名必须匹配
^[_a-zA-Z]\w*$,即“以字母开头,只含字母、数字、下划线”,否则报错退出; - 同名模块已可导入时(
find_spec探测)会被拒绝; - 目标目录已存在
scrapy.cfg时直接报错,退出码为 1。
命令成功结束时会提示下一步操作:cd project_dir 后运行 scrapy genspider example example.com。
genspider:基于模板生成爬虫
语法:scrapy genspider [-t template] <name> <domain or URL>(全局命令)。
在当前目录(项目外)或项目 spiders/ 目录(项目内)创建新爬虫。<name> 成为爬虫的 name 属性,<domain or URL> 用于生成 allowed_domains 和 start_urls 属性:
$ scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
$ scrapy genspider example example.com
Created spider 'example' using template 'basic'
$ scrapy genspider -t crawl scrapyorg scrapy.org
Created spider 'scrapyorg' using template 'crawl'
默认模板 basic 的内容见 scrapy/templates/spiders/basic.tmpl,渲染后的爬虫形如:
import scrapy
class $classname(scrapy.Spider):
name = "$name"
allowed_domains = ["$domain"]
start_urls = ["$url"]
def parse(self, response):
pass
这是最方便的爬虫脚手架,但不是唯一方式——完全可以手写爬虫源码文件。
scrapy genspider 除 -l(列出模板)、-t(指定模板)外,源码中还提供以下选项(见 scrapy/commands/genspider.py):-e/--edit(创建后立即编辑)、-d TEMPLATE(将模板内容打印到标准输出)、--force(爬虫已存在时强制覆盖)。
自定义爬虫模板
有两种方式提供自定义模板:
- 将
TEMPLATES_DIR设置指向一个包含spiders子目录的目录,为每个模板写一个{name}.tmpl文件,name即传给-t的值。自定义模板会整体替换内置模板——内置模板位于scrapy包内的templates目录(默认值见 scrapy/settings/default_settings.py:TEMPLATES_DIR = str((Path(__file__).parent / ".." / "templates").resolve())),想保留哪个就复制哪个过去; - 给
-t直接传一个.tmpl文件的路径,无需改动TEMPLATES_DIR(查找顺序是“相对路径 →TEMPLATES_DIR/spiders”,见 genspider.py 的_find_template())。
模板使用 string.Template 渲染:$variable 与 ${variable} 会被替换,$$ 渲染为单个 $(正则表达式中常用)。除下列变量外的任何变量都会导致渲染失败:
name:传给命令的爬虫名;module:将name规范化为合法模块名(连字符、点号替换为下划线,非字母开头时加前缀a,见 genspider.py 的sanitize_module_name()),同时用作生成文件文件名;classname:module的驼峰形式加Spider后缀;url:传入的 URL,无协议时自动补https;domain:url的域名(urlparse(url).netloc);project_name:BOT_NAME;ProjectName:project_name的驼峰形式。
变量构造逻辑可对照 genspider.py 的 _generate_template_variables()。
可用命令总览
命令分为两类(判定标准是 requires_project 类属性,见 scrapy/cmdline.py 的 _get_commands_from_module()):
全局命令(无项目也可运行):startproject、genspider、settings、runspider、shell、fetch、view、version、bench
仅项目内命令:crawl、check、list、edit、parse
注意:全局命令在项目内运行时行为可能略有不同——它们会使用项目的设置。例如 fetch 在被抓 URL 关联到某个爬虫时,会应用该爬虫的覆盖行为(如 custom_settings 属性);这是有意设计,因为 fetch 的用途就是验证爬虫实际如何下载页面。
逐命令详解
crawl
- 语法:
scrapy crawl <spider> - 需要项目:是
以 list 报告中的某个爬虫 name 启动抓取;要运行文件中的爬虫请用 runspider。
支持的选项:
-h, --help:显示帮助并退出;-a NAME=VALUE:设置爬虫参数(可重复);--output FILE/-o FILE:把抓到的 item 追加到 FILE 末尾(-表示标准输出);在 URI 末尾加冒号指定格式,如-o FILE:FORMAT;--overwrite-output FILE/-O FILE:把 item 写入 FILE 并覆盖已有内容,格式用法同上。
$ scrapy crawl myspider
[ ... myspider starts crawling ... ]
$ scrapy crawl -o myfile:csv myspider
[ ... 抓取并追加结果到 myfile(csv 格式)... ]
$ scrapy crawl -O myfile:json myspider
[ ... 抓取并以 json 格式覆盖写入 myfile ... ]
源码实现见 scrapy/commands/crawl.py:一次只能传一个爬虫名(超过一个会 UsageError),-o/-O 由公共基类 BaseRunSpiderCommand 解析为 FEEDS 设置(feed_process_params_from_cli),因此输出走的是 Feed Export 机制;若 FeedExporter 扩展被禁用,engine 启动时会收到“配置了 FEEDS 但不会导出”的告警。
check
- 语法:
scrapy check [-l] <spider> - 需要项目:是
运行契约(contract)检查。
$ scrapy check -l
first_spider
* parse
* parse_item
second_spider
* parse
* parse_item
$ scrapy check
F.F.
======================================================================
FAIL: [first_spider] parse (@returns post-hook)
----------------------------------------------------------------------
Traceback (most recent call last):
...
scrapy.exceptions.ContractFail: Returned 92 requests, expected 0..4
======================================================================
FAIL: [first_spider] parse_item (@scrapes post-hook)
----------------------------------------------------------------------
Traceback (most recent call last):
...
scrapy.exceptions.ContractFail: Missing fields: RetailPricex
----------------------------------------------------------------------
Ran 4 contracts in 0.174s
FAILED (failures=2)
-l 只列出各爬虫中带契约的方法而不执行;不带 -l 时对指定爬虫(或全部爬虫)真实发起请求并校验。实现见 scrapy/commands/check.py,其 process_options() 会主动清空 ITEM_PIPELINES 与 FEEDS(契约会丢弃回调输出,避免 pipeline 产生副作用),测试报告格式沿用 unittest.TextTestRunner。
list
- 语法:
scrapy list - 需要项目:是
列出当前项目全部可用爬虫,每个一行:
$ scrapy list
spider1
spider2
实现很简单:通过 get_spider_loader(self.settings) 加载爬虫后打印 sorted(spider_loader.list())(见 scrapy/commands/list.py)。
edit
- 语法:
scrapy edit <spider> - 需要项目:是
用 EDITOR 环境变量(未设置时取 EDITOR 设置项)定义的编辑器打开指定爬虫文件。注意 scrapy/cmdline.py 中 execute() 会把环境变量 EDITOR 优先写入 settings,即环境变量优先于设置项。这只是一个最常用场景的快捷方式,开发者当然可以用任意工具或 IDE。
$ scrapy edit spider1
EDITOR 的值可包含参数(如 code -w),edit.py 会用 shlex.split 拆分后以子进程调用,不经过 shell。
fetch
- 语法:
scrapy fetch <url> - 需要项目:否
用 Scrapy 的 downloader 下载给定 URL,并把响应内容写到标准输出。它的价值在于“以爬虫的方式下载页面”:例如爬虫若通过 USER_AGENT 属性覆盖了 User Agent,fetch 就会使用那个值——用它来“看清”爬虫实际会拿到什么。项目外使用时不应用任何爬虫级行为,仅用 Scrapy 默认下载设置。
支持的选项:
--spider=SPIDER:跳过爬虫自动探测,强制使用指定爬虫;--headers:打印请求与响应的 HTTP 头,替代响应体;--no-redirect:不跟随 HTTP 3xx 重定向(默认跟随)。
$ scrapy fetch --nolog http://www.example.com/some/page.html
[ ... html content here ... ]
$ scrapy fetch --nolog --headers http://www.example.com/
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Accept-Language: en
> User-Agent: Scrapy/X.Y (+https://scrapy.org)
> Accept-Encoding: gzip, deflate, br, zstd
>
< Date: ...
< Content-Type: text/html
< Server: ...
从源码看(scrapy/commands/fetch.py),fetch 会构造一个只包含单个 Request 的爬虫,回调里打印响应;--no-redirect 通过 handle_httpstatus_all = True 实现“连 3xx 也原样打印”,而默认行为则是用 SequenceExclude(range(300, 400)) 让框架正常处理 3xx。
view
- 语法:
scrapy view <url> - 需要项目:否
像爬虫“看到”的那样在浏览器中打开 URL。有时爬虫看到的页面与普通用户不同,view 可用于确认爬虫所见是否符合预期。
支持的选项:
--spider=SPIDER:绕过自动探测,强制使用指定爬虫;--no-redirect:不跟随 HTTP 3xx 重定向(默认跟随)。
$ scrapy view http://www.example.com/some/page.html
[ ... browser starts ... ]
实现上 view.py 直接继承 fetch.Command,把“打印响应体”替换为对 TextResponse 调用 open_in_browser();非文本响应会报错“Cannot view a non-text response”。
shell
- 语法:
scrapy shell [url] - 需要项目:否
为给定 URL(可省略)启动 Scrapy 交互 shell,详见 shell 文档。还支持 UNIX 风格的本地文件路径——相对路径带 ./ 或 ../ 前缀,或绝对路径。
支持的选项:
--spider=SPIDER:绕过自动探测,强制使用指定爬虫;-c code:在 shell 中执行代码、打印结果并退出;--no-redirect:不跟随命令行参数 URL 的 HTTP 3xx 重定向(默认跟随);注意这只影响命令行传入的 URL,进入 shell 后fetch(url)默认仍会跟随重定向。
$ scrapy shell http://www.example.com/some/page.html
[ ... scrapy shell starts ... ]
$ scrapy shell --nolog http://www.example.com/ -c '(response.status, response.url)'
(200, 'http://www.example.com/')
# shell 默认跟随重定向
$ scrapy shell --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(200, 'http://example.com/')
# 可用 --no-redirect 关闭(仅针对命令行参数 URL)
$ scrapy shell --no-redirect --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(302, 'http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F')
源码中 shell 命令声明了 default_settings(见 scrapy/commands/shell.py):DUPEFILTER_CLASS 指向 BaseDupeFilter(不记录去重状态)、LOGSTATS_INTERVAL = 0(不输出周期统计)、REMOTE_CONTROL_ENABLED = False(不启用 telnet 远程控制)——这些都是为交互式调试做的轻量化处理。
parse
- 语法:
scrapy parse <url> [options] - 需要项目:是
抓取给定 URL,并用处理该 URL 的爬虫解析它;回调方法由 --callback 指定,缺省为 parse。
支持的选项:
--spider=SPIDER:绕过自动探测,强制使用指定爬虫;-a NAME=VALUE:设置爬虫参数(可重复);--callback/-c:解析响应所用的爬虫方法;--meta/-m:附加到回调请求的 request meta,必须是合法 JSON 字符串,如--meta='{"foo" : "bar"}';--cbkwargs:附加到回调的 kwargs,必须是合法 JSON 字符串,如--cbkwargs='{"foo" : "bar"}';--pipelines:让 item 经过 item pipeline 处理;--rules/-r:用CrawlSpider的 rules 发现解析响应所用的回调方法;--noitems:不显示抓到的 item;--nolinks:不显示提取出的链接;--nocolour:不使用 pygments 着色;--depth/-d:递归跟随请求的深度(默认 1);--verbose/-v:显示每一深度层级的信息;--output/-o:把抓到的 item 转储到文件。
$ scrapy parse http://www.example.com/ -c parse_item
[ ... scrapy log lines crawling example.com spider ... ]
>>> STATUS DEPTH LEVEL 1 <<<
# Scraped Items ------------------------------------------------------------
[{'name': 'Example item',
'category': 'Furniture',
'length': '12 cm'}]
# Requests -----------------------------------------------------------------
[]
settings
- 语法:
scrapy settings [options] - 需要项目:否
查看设置项的值。项目内使用时显示项目设置值,否则显示 Scrapy 默认值:
$ scrapy settings --get BOT_NAME
scrapybot
$ scrapy settings --get DOWNLOAD_DELAY
0
源码 settings.py 中还提供了类型化的读取选项:--getbool SETTING、--getint SETTING、--getfloat SETTING、--getlist SETTING,分别按布尔/整数/浮点/列表解释并打印。
runspider
- 语法:
scrapy runspider <spider_file.py> - 需要项目:否
运行给定 Python 文件中定义的爬虫,无需项目。支持的选项与 crawl 相同(二者共用 BaseRunSpiderCommand 基类)。
$ scrapy runspider myspider.py
[ ... spider starts crawling ... ]
实现细节(scrapy/commands/runspider.py):临时把文件所在目录插入 sys.path 头部导入该文件,要求文件中至少有一个 Spider 子类(取第一个);其 default_settings 将 SPIDER_LOADER_CLASS 设为 DummySpiderLoader,即不加载任何项目爬虫。
version
- 语法:
scrapy version [-v] - 需要项目:否
打印 Scrapy 版本;加 -v 同时打印 Python、Twisted 和平台信息,提交 bug 报告时有用:
$ scrapy version -v
Scrapy : 2.x.y
Python : 3.x.z ...
Twisted : ...
bench
- 语法:
scrapy bench - 需要项目:否
运行一个快速基准测试,详见 benchmarking 文档。
从 scrapy/commands/bench.py 可以看到其工作方式:用 subprocess 启动本地基准服务器 scrapy.utils.benchserver(监听 http://localhost:8998),然后运行内置的 _BenchSpider 抓取 total=100000 个页面,统计抓取速率——这是验证本机 Scrapy 运行环境性能的标准手段。
需要启动爬取的命令:CrawlerProcess 的选择机制
以下命令都需要以某种方式运行一次抓取(用户爬虫或内部特殊爬虫):bench、check、crawl、fetch、parse、runspider、shell、view。它们内部使用 scrapy.crawler.AsyncCrawlerProcess 或 scrapy.crawler.CrawlerProcess 的一个实例。大多数情况下这个细节对用户无关紧要,但当你需要非默认 Twisted reactor 时,它就很重要了。
Scrapy 的选择规则(见 scrapy/cmdline.py 的 execute()):
TWISTED_REACTOR_ENABLED为False时,使用AsyncCrawlerProcess;- 否则若
TWISTED_REACTOR为默认值'twisted.internet.asyncioreactor.AsyncioSelectorReactor',同样使用AsyncCrawlerProcess; - 其余情况使用
CrawlerProcess。
爬虫级设置不参与该决策——它在这个决定做出之后才加载。因此,如果项目级设置是 asyncio reactor(显式设置或 Scrapy 默认),而被运行爬虫的设置却改为其他 reactor,AsyncCrawlerProcess 会因只支持 asyncio reactor 而报错。此时的解决办法是把 FORCE_CRAWLER_PROCESS 设置为 True(项目级或在命令行传入),强制 Scrapy 使用支持所有 reactor 的 CrawlerProcess。相关设置的默认值可见 scrapy/settings/default_settings.py(FORCE_CRAWLER_PROCESS = False)与 asyncio 文档。
自定义项目命令
通过 COMMANDS_MODULE 注册
借助 COMMANDS_MODULE 设置可以为项目添加专属命令,它们会被自动发现并经 scrapy 工具暴露出来。
COMMANDS_MODULE 设置:默认值为空字符串 ''(见 default_settings.py)。指向一个用于查找自定义命令的模块,例如:
COMMANDS_MODULE = "mybot.commands"
创建自定义命令:继承 scrapy.commands.ScrapyCommand 并实现必需方法,即可为命令行界面扩展项目专属功能(如数据处理工具、部署辅助)。行为由类属性与重写方法共同决定。
可设置的属性:
requires_project(bool):为True时命令只能在项目内运行,默认False;requires_crawler_process(bool):为True时 Scrapy 会在命令运行前创建AsyncCrawlerProcess或CrawlerProcess实例并挂到crawler_process属性上,默认True;default_settings(dict):该命令运行时覆盖默认设置的字典,默认{};exitcode(int):命令完成时设置的进程退出码,默认0。
必须重写的方法:
short_desc():返回命令的简短描述;run(args, opts):命令执行的主入口。
可以重写的方法:
syntax():返回命令语法(建议单行、不含命令名);long_desc():返回详细描述;add_options(parser):向参数解析器添加命令专属选项;process_options(args, opts):处理命令行选项、在crawler_process实例化之前设置 settings。
一个完整示例:
from scrapy.commands import ScrapyCommand
import argparse
class MyCustomCommand(ScrapyCommand):
requires_project = True
def syntax(self):
return "[options] <spider_name>"
def short_desc(self):
return "Run my custom command"
def add_options(self, parser):
super().add_options(parser)
parser.add_argument("--my-option", help="My custom option")
def run(self, args, opts):
# Command implementation here
spider_name = args[0] if args else None
print(f"Running custom command for spider: {spider_name}")
真实示例可参考 scrapy/commands 目录下的全部内置命令。ScrapyCommand 类属性与 requires_project/requires_crawler_process 的默认值见 scrapy/commands/init.py。命令发现流程本身由 scrapy/cmdline.py 的 _get_commands_dict() 完成:先扫描内置 scrapy.commands 模块,再合并 entry points 与 COMMANDS_MODULE 中找到的命令类。
注意:COMMANDS_MODULE 属于 pre-crawler 设置,在创建爬虫进程之前就已生效。
通过 setup.py entry points 注册(供外部库使用)
外部库也可以在库的 setup.py(或等价打包配置)的 entry points 中添加 scrapy.commands 段来注册命令。例如添加 my_command 命令:
from setuptools import setup, find_packages
setup(
name="scrapy-mymodule",
entry_points={
"scrapy.commands": [
"my_command=my_scrapy_module.commands:MyCommand",
],
},
)
该机制在 scrapy/cmdline.py 中实现:_get_commands_from_entry_points() 通过 importlib.metadata.entry_points(group="scrapy.commands") 加载所有已安装库注册的命令,并与内置命令合并。
附注:deploy 命令的历史沿革
早期的 scrapy deploy 命令已在 1.0 中移除,被独立的 scrapyd-deploy 工具取代。部署相关需求请参考 Deploying your project 文档。
小结
scrapy 命令行工具是 Scrapy 的总入口:scrapy.cfg 三级合并加环境变量决定了“在哪个项目、用哪套设置”下工作;14 个内置命令覆盖了从 startproject 建项、genspider 生成爬虫,到 crawl/runspider 运行、fetch/view/shell/parse 调试、settings/version/bench 运维辅助的完整生命周期;而 ScrapyCommand 基类、COMMANDS_MODULE 与 scrapy.commands entry points 三条扩展路径,使团队可以无缝地把私有工具接入 scrapy 命令空间。遇到行为疑问时,scrapy <command> -h 加上 scrapy/commands 与 scrapy/cmdline.py 源码,是最快的定位路径。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00