Das erste Scraping funktioniert einwandfrei, aber wenn ich das zweite Scraping starte, erhalte ich einen ReactorNotRestartable-Fehler.
Hier ist mein Code (ich habe die pädagogische Sprache vereinfacht und Quartos Elemente entfernt):
Code: Select all
import scrapy
from scrapy.crawler import CrawlerProcess
import nest_asyncio
import json
Code: Select all
class ScraperQuotesToScrapeSpider(scrapy.Spider):
name = 'scraper_quotes_to_scrape'
allowed_domains = ['https://quotes.toscrape.com']
start_urls = ['https://quotes.toscrape.com/']
def parse(self, response):
quotes_elements = response.css('div.quote')
for quote_element in quotes_elements:
author = quote_element.css('small.author::text').get()
quote = quote_element.css('span.text::text').get()
tags = quote_element.css('div.tags a.tag::text').getall()
quotes = {
'author': author,
'quote': quote,
'tags': tags
}
yield quotes
Code: Select all
nest_asyncio.apply()
process = CrawlerProcess(
settings={
"FEEDS": {
"quotes.json": {"format": "json", "overwrite": "True"},
},
}
)
process.crawl(ScraperQuotesToScrapeSpider)
process.start()
Code: Select all
with open('quotes.json', 'r') as f:
for line in f:
print (line)
Code: Select all
class ScraperQuotesToScrapeSpider(scrapy.Spider):
name = 'scraper_quotes_to_scrape'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['https://quotes.toscrape.com/']
def parse(self, response):
print("Processing ", response.url)
quotes_elements = response.css('div.quote')
for quote_element in quotes_elements:
author = quote_element.css('small.author::text').get()
quote = quote_element.css('span.text::text').get()
tags = quote_element.css('div.tags a.tag::text').getall()
quotes = {
'author': author,
'quote': quote,
'tags': tags
}
yield quotes
next_page = response.css('.next a::attr(href)').get()
# domain = self.start_urls[0][0:len(self.start_urls[0])-1]
# next_page = domain + next_page
# print("next page = ", next_page)
if next_page is not None:
yield response.follow(next_page, self.parse)
Code: Select all
nest_asyncio.apply()
process = CrawlerProcess(
settings={
"FEEDS": {
"quotes.json": {"format": "json", "overwrite": "True"},
},
}
)
process.crawl(ScraperQuotesToScrapeSpider)
process.start()
with open('quotes.json', 'r') as f:
for line in f:
print (line)
Meine Frage lautet also: Wie kann ich die erste Spider-Instanz nach ihrer Ausführung stoppen?
Ich kann mir vorstellen, dass ich sie nicht wiederverwenden kann, weil ich die Scrapy-Klasse geändert habe.
Dann kann ich meinen ersten Spider und seine Ausführung nicht kommentieren, um mein Quarto korrekt darzustellen Seite.
Schließlich denke ich darüber nach, den ersten Spider-Prozess zu beenden, bevor ich meinen zweiten Spider starte, aber ich habe keinen geeigneten Weg gefunden, dies zu tun (ich habe mir einen einfachen Prozess vorgestellt.stop(), aber nein).
Mobile version