So stoppen/töten Sie eine erreichte Scrapy-Spider-Instanz in RStudioPython

Python-Programme
Anonymous
 So stoppen/töten Sie eine erreichte Scrapy-Spider-Instanz in RStudio

Post by Anonymous »

Ich mache ein Tutorial zum Scrapy mit Scrapy. Dafür verwende ich Quarto/RStudio und die Website https://quotes.toscrape.com/. Aus pädagogischen Gründen muss ich einen ersten Crawl auf der ersten Seite durchführen, dann einen zweiten Crawl auf den Seiten derselben Ebene und dann einen dritten Crawl auf den Biografieseiten der untergeordneten Ebene. Jedes Mal schreibe ich meine Scrapy-Klasse mit zusätzlichen Daten neu, um ihre Funktionalität zu erhöhen. Also muss ich jedes Mal meine Spinne neu ausführen.
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
Scrapy-Klasse zum Verschrotten der ersten Seite:

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
Ausführung:

Code: Select all

nest_asyncio.apply()
process = CrawlerProcess(
settings={
"FEEDS": {
"quotes.json": {"format": "json", "overwrite": "True"},
},
}
)

process.crawl(ScraperQuotesToScrapeSpider)
process.start()

Daten lesen:

Code: Select all

with open('quotes.json', 'r') as f:
for line in f:
print (line)
Jetzt ändern wir die Scrapy-Klasse, um Seiten derselben Ebene zu löschen:

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)
Wir starten das Skript und lesen die ausgegebenen Daten:

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)
Hier erhalte ich den ReactorNotRestartable-Fehler.
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).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post