Basic support for async def start_requests.

This commit is contained in:
Andrey Rakhmatullin 2019-09-13 23:58:10 +05:00
parent 8845773d44
commit 573577e4b2
2 changed files with 19 additions and 1 deletions

View File

@ -1,3 +1,4 @@
import inspect
import logging
import pprint
import signal
@ -21,6 +22,7 @@ from scrapy.extension import ExtensionManager
from scrapy.interfaces import ISpiderLoader
from scrapy.settings import overridden_settings, Settings
from scrapy.signalmanager import SignalManager
from scrapy.utils.defer import deferred_from_coro
from scrapy.utils.log import (
configure_logging,
get_scrapy_root_handler,
@ -84,7 +86,10 @@ class Crawler:
try:
self.spider = self._create_spider(*args, **kwargs)
self.engine = self._create_engine()
start_requests = iter(self.spider.start_requests())
if inspect.iscoroutinefunction(self.spider.start_requests):
start_requests = yield deferred_from_coro(self.spider.start_requests())
else:
start_requests = iter(self.spider.start_requests())
yield self.engine.open_spider(self.spider, start_requests)
yield defer.maybeDeferred(self.engine.start)
except Exception:

View File

@ -15,6 +15,7 @@ import re
import sys
from urllib.parse import urlparse
from pytest import mark
from twisted.internet import reactor, defer
from twisted.web import server, static, util
from twisted.trial import unittest
@ -83,6 +84,11 @@ class ItemZeroDivisionErrorSpider(TestSpider):
}
class StartRequestsAsyncDefSpider(TestSpider):
async def start_requests(self):
return [Request(url, dont_filter=True) for url in self.start_urls]
def start_test_site(debug=False):
root_dir = os.path.join(tests_datadir, "test_site")
r = static.File(root_dir)
@ -201,6 +207,13 @@ class EngineTest(unittest.TestCase):
yield self.run.run()
self._assert_items_error()
@mark.only_asyncio()
@defer.inlineCallbacks
def test_crawler_startrequests_asyncdef(self):
self.run = CrawlerRun(StartRequestsAsyncDefSpider)
yield self.run.run()
self._assert_visited_urls()
def _assert_visited_urls(self):
must_be_visited = ["/", "/redirect", "/redirected",
"/item1.html", "/item2.html", "/item999.html"]