- python 3.12.1
- scrapy 2.11.2
- pytest 8.2.1
Код: Выделить всё
from typing import Iterable
import scrapy
from scrapy.http import Request
class BookSpider(scrapy.Spider):
name = None
def start_requests(self) -> Iterable[Request]:
yield scrapy.Request("https://books.toscrape.com/")
def parse(self, response):
books = response.css("article.product_pod")
for book in books:
yield {
"name": self.name,
"title": book.css("h3 a::text").get().strip(),
}
Код: Выделить всё
import json
import os
from pytest_twisted import inlineCallbacks
from scrapy.crawler import CrawlerRunner
from twisted.internet import defer
from bookspider import BookSpider
@inlineCallbacks
def test_bookspider():
runner = CrawlerRunner(
settings={
"REQUEST_FINGERPRINTER_IMPLEMENTATION": "2.7",
"FEEDS": {"books.json": {"format": "json"}},
"TWISTED_REACTOR": "twisted.internet.asyncioreactor.AsyncioSelectorReactor",
# "TWISTED_REACTOR": "twisted.internet.selectreactor.SelectReactor",
}
)
yield runner.crawl(BookSpider, name="books")
with open("books.json", "r") as f:
books = json.load(f)
assert len(books) >= 1
assert books[0]["name"] == "books"
assert books[0]["title"] == "A Light in the ..."
os.remove("books.json")
defer.returnValue(None)
Код: Выделить всё
Exception: The installed reactor (twisted.internet.selectreactor.SelectReactor) does not match the requested one (twisted.internet.asyncioreactor.AsyncioSelectorReactor)Может кто-нибудь объяснит это поведение и, в более широком смысле, как протестировать CrawlerRunner или CrawlerProcess с помощью pytest?
Подробнее здесь: https://stackoverflow.com/questions/785 ... torreactor