Scrapy如何通过名称找到Spider类?

2 投票
2 回答
1636 浏览
提问于 2025-04-18 01:01

假设我有一个这样的爬虫:

class SomeSPider(Spider):
     name ='spname'

然后我可以通过创建一个新的 SomeSpider 实例来运行我的爬虫,比如这样调用爬虫:

spider= SomeSpider()
crawler = Crawler(settings)
crawler.configure()
crawler.crawl(spider)
....

我能不能只用爬虫的名字来做同样的事情?也就是说,用 'spname'?

crawler.crawl('spname') ## I give just the spider name here

如何动态创建爬虫呢?我猜 scrapy 管理器在内部已经处理了这个,因为这样做是没问题的:

Scrapy crawl spname   

一种解决方案是解析我的爬虫文件夹,获取所有的爬虫类,然后用名字属性来过滤它们?不过这听起来有点不太靠谱!

谢谢你们的帮助。

2 个回答

3

请看一下源代码:

# scrapy/commands/crawl.py

class Command(ScrapyCommand):

    def run(self, args, opts):
        ...

# scrapy/spidermanager.py

class SpiderManager(object):

    def _load_spiders(self, module):
        ...

    def create(self, spider_name, **spider_kwargs):
        ...

# scrapy/utils/spider.py

def iter_spider_classes(module):
    """Return an iterator over all spider classes defined in the given module
    that can be instantiated (ie. which have name)
    """
    ...
1

受到@kev的回答启发,这里有一个用来检查蜘蛛类的函数:

from scrapy.utils.misc import walk_modules
from scrapy.utils.spider import iter_spider_classes

def _load_spiders(module='spiders.SomeSpider'):
    for module in walk_modules(module):
        for spcls in iter_spider_classes(module):
            self._spiders[spcls.name] = spcls

然后你可以创建一个实例:

somespider = self._spiders['spname']()

撰写回答