scrapy crawl myspider -a category=books 里的 -a 到底把值交给了谁?为什么 page=3 变成了字符串?start_urls 能不能直接传?__init__ 要怎么写?这篇逐个实测,把最容易踩的坑列出来。
-a category=books -a page=3:[{'category': 'books', 'page': '3', 'page_type': 'str', 'extra': '(没有)'}](class 属性 category 被覆盖;page 是字符串 “3”)
值里带 =:[{'url': 'http://x/?a=1&b=2', 'eq': 'a=b=c'}](按第一个 = 拆分)-a 的键值对作为关键字参数传给 spider 的构造函数,默认的 Spider.__init__ 把它们设成实例属性,同名的类属性被覆盖。
推荐写法 __init__(self, category=None, **kwargs) + super().__init__(**kwargs):[{'category': 'books', 'other': '1'}]
漏了 **kwargs:退出码 1;["TypeError: S.__init__() got an unexpected keyword argument 'other'"]自己写 __init__ 时要接收 **kwargs 并传给 super().__init__,否则多传一个参数就 TypeError。
-a start_urls=http://…/only:退出码 0;服务器收到 [];回调 [];日志里的错误:['2026-10-12 18:45:57 [scrapy.core.engine] ERROR: Error while reading start items and requests: Missing scheme i', 'raise ValueError(f"Missing scheme in request url: {self._url}")']
-a start_urls=[…](JSON 风格的字符串):服务器收到 []
-a novalue(没有 =):退出码 2;['Usage', 'python -m scrapy: error: Invalid -a value, use -a NAME=VALUE']命令行上的值总是字符串。start_urls 直接传字符串会被按字符遍历,抛 Missing scheme 却以退出码 0 结束;没有 = 的 -a 直接报参数错误。
-a urls=a,b 由 __init__ 拆成 start_urls:服务器收到 ['/a', '/b']
列表要自己解析,比如逗号分隔再 split 成 start_urls。
p.crawl(S, page=3, opts={…}):[{'page': 3, 'page_type': 'int', 'opts': {'k': [1, 2]}, 'opts_type': 'dict', 'setting_same_name': 'from-settings'}](类型保留;同名的设置 PAGE 是另一回事)CrawlerProcess.crawl(S, **kwargs) 可以传任意类型,原样保留,与同名设置互不影响。