mirror of https://github.com/scrapy/scrapy.git
rename CrawlerRunner.spiders to CrawlerRunner.spider_loader
This commit is contained in:
parent
fee5565709
commit
ad587ea792
|
|
@ -69,10 +69,10 @@ class Command(ScrapyCommand):
|
|||
# contract requests
|
||||
contract_reqs = defaultdict(list)
|
||||
|
||||
spiders = self.crawler_process.spiders
|
||||
spider_loader = self.crawler_process.spider_loader
|
||||
|
||||
for spidername in args or spiders.list():
|
||||
spidercls = spiders.load(spidername)
|
||||
for spidername in args or spider_loader.list():
|
||||
spidercls = spider_loader.load(spidername)
|
||||
spidercls.start_requests = lambda s: conman.from_spider(s, result)
|
||||
|
||||
tested_methods = conman.tested_methods_from_spidercls(spidercls)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ class Command(ScrapyCommand):
|
|||
|
||||
editor = self.settings['EDITOR']
|
||||
try:
|
||||
spidercls = self.crawler_process.spiders.load(args[0])
|
||||
spidercls = self.crawler_process.spider_loader.load(args[0])
|
||||
except KeyError:
|
||||
return self._err("Spider not found: %s" % args[0])
|
||||
|
||||
|
|
|
|||
|
|
@ -48,10 +48,10 @@ class Command(ScrapyCommand):
|
|||
request.meta['handle_httpstatus_all'] = True
|
||||
|
||||
spidercls = DefaultSpider
|
||||
spiders = self.crawler_process.spiders
|
||||
spider_loader = self.crawler_process.spider_loader
|
||||
if opts.spider:
|
||||
spidercls = spiders.load(opts.spider)
|
||||
spidercls = spider_loader.load(opts.spider)
|
||||
else:
|
||||
spidercls = spidercls_for_request(spiders, request, spidercls)
|
||||
spidercls = spidercls_for_request(spider_loader, request, spidercls)
|
||||
self.crawler_process.crawl(spidercls, start_requests=lambda: [request])
|
||||
self.crawler_process.start()
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ class Command(ScrapyCommand):
|
|||
return
|
||||
|
||||
try:
|
||||
spidercls = self.crawler_process.spiders.load(name)
|
||||
spidercls = self.crawler_process.spider_loader.load(name)
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -10,5 +10,5 @@ class Command(ScrapyCommand):
|
|||
return "List available spiders"
|
||||
|
||||
def run(self, args, opts):
|
||||
for s in sorted(self.crawler_process.spiders.list()):
|
||||
for s in sorted(self.crawler_process.spider_loader.list()):
|
||||
print(s)
|
||||
|
|
|
|||
|
|
@ -124,15 +124,15 @@ class Command(ScrapyCommand):
|
|||
level=log.ERROR, spider=spider.name)
|
||||
|
||||
def set_spidercls(self, url, opts):
|
||||
spiders = self.crawler_process.spiders
|
||||
spider_loader = self.crawler_process.spider_loader
|
||||
if opts.spider:
|
||||
try:
|
||||
self.spidercls = spiders.load(opts.spider)
|
||||
self.spidercls = spider_loader.load(opts.spider)
|
||||
except KeyError:
|
||||
log.msg(format='Unable to find spider: %(spider)s',
|
||||
level=log.ERROR, spider=opts.spider)
|
||||
else:
|
||||
self.spidercls = spidercls_for_request(spiders, Request(url))
|
||||
self.spidercls = spidercls_for_request(spider_loader, Request(url))
|
||||
if not self.spidercls:
|
||||
log.msg(format='Unable to find spider for: %(url)s',
|
||||
level=log.ERROR, url=url)
|
||||
|
|
|
|||
|
|
@ -42,13 +42,13 @@ class Command(ScrapyCommand):
|
|||
|
||||
def run(self, args, opts):
|
||||
url = args[0] if args else None
|
||||
spiders = self.crawler_process.spiders
|
||||
spider_loader = self.crawler_process.spider_loader
|
||||
|
||||
spidercls = DefaultSpider
|
||||
if opts.spider:
|
||||
spidercls = spiders.load(opts.spider)
|
||||
spidercls = spider_loader.load(opts.spider)
|
||||
elif url:
|
||||
spidercls = spidercls_for_request(spiders, Request(url),
|
||||
spidercls = spidercls_for_request(spider_loader, Request(url),
|
||||
spidercls, log_multiple=True)
|
||||
|
||||
# The crawler is created this way since the Shell manually handles the
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ class Crawler(object):
|
|||
def spiders(self):
|
||||
if not hasattr(self, '_spiders'):
|
||||
warnings.warn("Crawler.spiders is deprecated, use "
|
||||
"CrawlerRunner.spiders or instantiate "
|
||||
"CrawlerRunner.spider_loader or instantiate "
|
||||
"scrapy.spiderloader.SpiderLoader with your "
|
||||
"settings.",
|
||||
category=ScrapyDeprecationWarning, stacklevel=2)
|
||||
|
|
@ -84,10 +84,17 @@ class CrawlerRunner(object):
|
|||
if isinstance(settings, dict):
|
||||
settings = Settings(settings)
|
||||
self.settings = settings
|
||||
self.spiders = _get_spider_loader(settings)
|
||||
self.spider_loader = _get_spider_loader(settings)
|
||||
self.crawlers = set()
|
||||
self._active = set()
|
||||
|
||||
@property
|
||||
def spiders(self):
|
||||
warnings.warn("CrawlerRunner.spiders attribute is renamed to "
|
||||
"CrawlerRunner.spider_loader.",
|
||||
category=ScrapyDeprecationWarning, stacklevel=2)
|
||||
return self.spider_loader
|
||||
|
||||
def crawl(self, crawler_or_spidercls, *args, **kwargs):
|
||||
crawler = crawler_or_spidercls
|
||||
if not isinstance(crawler_or_spidercls, Crawler):
|
||||
|
|
@ -107,7 +114,7 @@ class CrawlerRunner(object):
|
|||
|
||||
def _create_crawler(self, spidercls):
|
||||
if isinstance(spidercls, six.string_types):
|
||||
spidercls = self.spiders.load(spidercls)
|
||||
spidercls = self.spider_loader.load(spidercls)
|
||||
return Crawler(spidercls, self.settings)
|
||||
|
||||
def _setup_crawler_logging(self, crawler):
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class SpiderLoader(object):
|
|||
|
||||
def find_by_request(self, request):
|
||||
"""
|
||||
Return the list of spiders names that can handle the given request.
|
||||
Return the list of spider names that can handle the given request.
|
||||
"""
|
||||
return [name for name, cls in self._spiders.items()
|
||||
if cls.handles_request(request)]
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ def iter_spider_classes(module):
|
|||
getattr(obj, 'name', None):
|
||||
yield obj
|
||||
|
||||
def spidercls_for_request(spiderloader, request, default_spidercls=None,
|
||||
def spidercls_for_request(spider_loader, request, default_spidercls=None,
|
||||
log_none=False, log_multiple=False):
|
||||
"""Return a spider class that handles the given Request.
|
||||
|
||||
|
|
@ -38,9 +38,9 @@ def spidercls_for_request(spiderloader, request, default_spidercls=None,
|
|||
default_spidercls passed. It can optionally log if multiple or no spiders
|
||||
are found.
|
||||
"""
|
||||
snames = spiderloader.find_by_request(request)
|
||||
snames = spider_loader.find_by_request(request)
|
||||
if len(snames) == 1:
|
||||
return spiderloader.load(snames[0])
|
||||
return spider_loader.load(snames[0])
|
||||
|
||||
if len(snames) > 1 and log_multiple:
|
||||
log.msg(format='More than one spider can handle: %(request)s - %(snames)s',
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ class CrawlerTestCase(unittest.TestCase):
|
|||
spiders = self.crawler.spiders
|
||||
self.assertEqual(len(w), 1)
|
||||
self.assertIn("Crawler.spiders", str(w[0].message))
|
||||
sm_cls = load_object(self.crawler.settings['SPIDER_LOADER_CLASS'])
|
||||
self.assertIsInstance(spiders, sm_cls)
|
||||
sl_cls = load_object(self.crawler.settings['SPIDER_LOADER_CLASS'])
|
||||
self.assertIsInstance(spiders, sl_cls)
|
||||
|
||||
self.crawler.spiders
|
||||
self.assertEqual(len(w), 1, "Warn deprecated access only once")
|
||||
|
|
@ -78,3 +78,12 @@ class CrawlerRunnerTestCase(unittest.TestCase):
|
|||
)
|
||||
self.assertIsInstance(runner.settings, Settings)
|
||||
|
||||
def test_deprecated_attribute_spiders(self):
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
runner = CrawlerRunner(Settings())
|
||||
spiders = runner.spiders
|
||||
self.assertEqual(len(w), 1)
|
||||
self.assertIn("CrawlerRunner.spiders", str(w[0].message))
|
||||
self.assertIn("CrawlerRunner.spider_loader", str(w[0].message))
|
||||
sl_cls = load_object(runner.settings['SPIDER_LOADER_CLASS'])
|
||||
self.assertIsInstance(spiders, sl_cls)
|
||||
|
|
|
|||
|
|
@ -26,53 +26,53 @@ class SpiderLoaderTest(unittest.TestCase):
|
|||
shutil.copytree(orig_spiders_dir, self.spiders_dir)
|
||||
sys.path.append(self.tmpdir)
|
||||
settings = Settings({'SPIDER_MODULES': ['test_spiders_xxx']})
|
||||
self.spiderloader = SpiderLoader.from_settings(settings)
|
||||
self.spider_loader = SpiderLoader.from_settings(settings)
|
||||
|
||||
def tearDown(self):
|
||||
del self.spiderloader
|
||||
del self.spider_loader
|
||||
del sys.modules['test_spiders_xxx']
|
||||
sys.path.remove(self.tmpdir)
|
||||
|
||||
def test_interface(self):
|
||||
verifyObject(ISpiderLoader, self.spiderloader)
|
||||
verifyObject(ISpiderLoader, self.spider_loader)
|
||||
|
||||
def test_list(self):
|
||||
self.assertEqual(set(self.spiderloader.list()),
|
||||
self.assertEqual(set(self.spider_loader.list()),
|
||||
set(['spider1', 'spider2', 'spider3']))
|
||||
|
||||
def test_load(self):
|
||||
spider1 = self.spiderloader.load("spider1")
|
||||
spider1 = self.spider_loader.load("spider1")
|
||||
self.assertEqual(spider1.__name__, 'Spider1')
|
||||
|
||||
def test_find_by_request(self):
|
||||
self.assertEqual(self.spiderloader.find_by_request(Request('http://scrapy1.org/test')),
|
||||
self.assertEqual(self.spider_loader.find_by_request(Request('http://scrapy1.org/test')),
|
||||
['spider1'])
|
||||
self.assertEqual(self.spiderloader.find_by_request(Request('http://scrapy2.org/test')),
|
||||
self.assertEqual(self.spider_loader.find_by_request(Request('http://scrapy2.org/test')),
|
||||
['spider2'])
|
||||
self.assertEqual(set(self.spiderloader.find_by_request(Request('http://scrapy3.org/test'))),
|
||||
self.assertEqual(set(self.spider_loader.find_by_request(Request('http://scrapy3.org/test'))),
|
||||
set(['spider1', 'spider2']))
|
||||
self.assertEqual(self.spiderloader.find_by_request(Request('http://scrapy999.org/test')),
|
||||
self.assertEqual(self.spider_loader.find_by_request(Request('http://scrapy999.org/test')),
|
||||
[])
|
||||
self.assertEqual(self.spiderloader.find_by_request(Request('http://spider3.com')),
|
||||
self.assertEqual(self.spider_loader.find_by_request(Request('http://spider3.com')),
|
||||
[])
|
||||
self.assertEqual(self.spiderloader.find_by_request(Request('http://spider3.com/onlythis')),
|
||||
self.assertEqual(self.spider_loader.find_by_request(Request('http://spider3.com/onlythis')),
|
||||
['spider3'])
|
||||
|
||||
def test_load_spider_module(self):
|
||||
module = 'tests.test_spiderloader.test_spiders.spider1'
|
||||
settings = Settings({'SPIDER_MODULES': [module]})
|
||||
self.spiderloader = SpiderLoader.from_settings(settings)
|
||||
assert len(self.spiderloader._spiders) == 1
|
||||
self.spider_loader = SpiderLoader.from_settings(settings)
|
||||
assert len(self.spider_loader._spiders) == 1
|
||||
|
||||
def test_load_spider_module(self):
|
||||
prefix = 'tests.test_spiderloader.test_spiders.'
|
||||
module = ','.join(prefix + s for s in ('spider1', 'spider2'))
|
||||
settings = Settings({'SPIDER_MODULES': module})
|
||||
self.spiderloader = SpiderLoader.from_settings(settings)
|
||||
assert len(self.spiderloader._spiders) == 2
|
||||
self.spider_loader = SpiderLoader.from_settings(settings)
|
||||
assert len(self.spider_loader._spiders) == 2
|
||||
|
||||
def test_load_base_spider(self):
|
||||
module = 'tests.test_spiderloader.test_spiders.spider0'
|
||||
settings = Settings({'SPIDER_MODULES': [module]})
|
||||
self.spiderloader = SpiderLoader.from_settings(settings)
|
||||
assert len(self.spiderloader._spiders) == 0
|
||||
self.spider_loader = SpiderLoader.from_settings(settings)
|
||||
assert len(self.spider_loader._spiders) == 0
|
||||
|
|
|
|||
Loading…
Reference in New Issue