Issue #3264, fix error handling when spider is not matched

Changes
Implementation:
- Check whether Spider exists or is None, and if it's None skip execution of start_requests() with non existing Spider
Testing:
- Add a test case with invalid url inside test_command_parse
  Test proves that non-matched Spider does not throw an AttributeError
This commit is contained in:
Andreas Tziortziortziopoulos 2022-05-06 03:59:30 +03:00
parent ded28f7bb9
commit 83c1939281
2 changed files with 7 additions and 1 deletions

View File

@ -146,7 +146,8 @@ class Command(BaseRunSpiderCommand):
def _start_requests(spider):
yield self.prepare_request(spider, Request(url), opts)
self.spidercls.start_requests = _start_requests
if self.spidercls:
self.spidercls.start_requests = _start_requests
def start_parsing(self, url, opts):
self.crawler_process.crawl(self.spidercls, **opts.spargs)

View File

@ -1,6 +1,7 @@
import os
import argparse
from os.path import join, abspath, isfile, exists
from twisted.internet import defer
from scrapy.commands import parse
from scrapy.settings import Settings
@ -222,6 +223,10 @@ ITEM_PIPELINES = {{'{self.project_name}.pipelines.MyPipeline': 1}}
self.assertRegex(_textmode(out), r"""# Scraped Items -+\n\[\]""")
self.assertIn("""Cannot find a rule that matches""", _textmode(stderr))
status, out, stderr = yield self.execute([self.url('/invalid_url')])
self.assertEqual(status, 0)
self.assertIn("""""", _textmode(stderr))
@defer.inlineCallbacks
def test_output_flag(self):
"""Checks if a file was created successfully having