Получение Scrapy и pytest для работы с AsyncioSelectorReactorPython

Программы на Python
Anonymous
Получение Scrapy и pytest для работы с AsyncioSelectorReactor

Сообщение Anonymous »

Чтобы воспроизвести мою проблему
  • python 3.12.1
  • scrapy 2.11.2
  • pytest 8.2.1
В bookspider.py у меня есть:

Код: Выделить всё

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(),
}
В test_bookspider.py у меня есть:

Код: Выделить всё

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)
Если "TWISTED_REACTOR": "twisted.internet.asyncioreactor.AsyncioSelectorReactor" раскомментировать, я получаю следующую ошибку:

Код: Выделить всё

Exception: The installed reactor (twisted.internet.selectreactor.SelectReactor) does not match the requested one (twisted.internet.asyncioreactor.AsyncioSelectorReactor)
С помощью "TWISTED_REACTOR": "twisted.internet.selectreactor.SelectReactor" раскомментировал мои пройденные тесты.
Может кто-нибудь объяснит это поведение и, в более широком смысле, как протестировать CrawlerRunner или CrawlerProcess с помощью pytest?

Подробнее здесь: https://stackoverflow.com/questions/785 ... torreactor

Вернуться в «Python»