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
相关产品推荐
相关产品推荐

