You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy 1.4调用create_crawler()报错:需2个参数却传入1个

解决Scrapy 1.4中create_crawler() takes exactly 2 arguments (1 given)的错误

嘿,别担心,这个问题是Scrapy版本升级带来的API变更导致的,和你的Python逻辑没关系!我之前从旧版本升级到1.x的时候也踩过这个坑。

错误原因

Scrapy 1.0之后,CrawlerProcess.create_crawler()的方法签名发生了变化:

  • 在Scrapy 0.19里,你可以不带参数调用它来创建一个通用的crawler;
  • 但到了Scrapy 1.x(包括你用的1.4),这个方法必须传入爬虫类或者爬虫名称作为参数,所以你直接调用self.crawler_process.create_crawler()就会触发参数不足的TypeError。

针对你的需求修改代码

你的目标是列出项目中所有爬虫,再匹配数据库里的活跃站点,然后用Scrapyd调度。其实根本不需要创建crawler来获取爬虫列表——Scrapy提供了更直接的方式:spider_loader.list()。

把你run方法里的这部分代码:

crawler = self.crawler_process.create_crawler()
crawler.spiders.list()
for s in crawler.spiders.list():

替换成:

# 直接获取项目中所有可用的爬虫名称
spider_names = self.crawler_process.spider_loader.list()
for s in spider_names:

修改后的完整run方法代码如下:

def run(self, args, opts):
    cursor = get_db_connection()
    cursor.execute("SELECT * FROM lojas WHERE disponivel = 'S'")
    rows = cursor.fetchall()
    # 将所有网站的域名放入列表
    sites = []
    for row in rows:
        site = row[2]
        print(site)  # 注意:如果用Python 3,print需要加括号
        sites.append(site)
    url = 'http://localhost:6800/schedule.json'
    # 获取所有爬虫名称
    spider_names = self.crawler_process.spider_loader.list()
    for s in spider_names:
        if s in sites:
            values = {'project' : 'esportifique', 'spider' : s}
            r = requests.post(url, data=values)
            print(r.text)

额外小提示

如果你之后需要手动创建某个特定爬虫的crawler(比如不通过Scrapyd调度,自己运行爬虫),正确的调用方式是:

# 通过爬虫名称创建
crawler = self.crawler_process.create_crawler('your_spider_name')
# 或者通过爬虫类创建
from your_project.spiders import YourSpider
crawler = self.crawler_process.create_crawler(YourSpider)

内容的提问来源于stack exchange,提问作者Ailton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:48