Scrapling in Scrapy einbinden¶
Sie müssen ein bestehendes Scrapy-Projekt nicht neu schreiben, um Scraplings Parsing-API zu nutzen. Die Integration wandelt Scrapy-Antworten direkt in Ihren Spider-Callbacks in Response-Objekte von Scrapling um. Scrapy übernimmt weiter das Crawling, während Scrapling den Inhalt parst.
Installation
Diese Integration funktioniert mit der Standardinstallation von Scrapling (pip install scrapling). Extras sind nicht nötig. Nur Scrapy muss installiert sein, was bei einem Scrapy-Projekt bereits der Fall ist.
Verwendung¶
Fügen Sie einem Spider-Callback den Dekorator scrapling_response hinzu. Das Argument response, das er erhält, wird dann zu einem Scrapling-Response:
import scrapy
from scrapling.integrations.scrapy import scrapling_response
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ["https://quotes.toscrape.com"]
@scrapling_response
def parse(self, response): # `response` is now a Scrapling Response
first_quote = response.find_by_text("The world as we have created it", partial=True)
for quote in [first_quote, *first_quote.find_similar()]:
card = quote.parent
yield {
"text": quote.get_all_text(strip=True),
"author": card.find("small", class_="author").text,
"tags": [tag.text for tag in card.find_all("a", class_="tag")],
}
next_page = response.css("li.next a::attr(href)").get()
if next_page:
yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
Der Dekorator unterstützt alle Callback-Arten von Scrapy: normale Funktionen, Generatoren, Coroutinen und asynchrone Generatoren. Er behält die Art, den Namen und den Docstring des Callbacks bei. Scrapy kann den Callback also weiterhin untersuchen und seine Contracts prüfen.
Sie können dem Dekorator auch eine Selector-Konfiguration übergeben. Sie wird an das erzeugte Response weitergegeben:
Wenn Sie eine Scrapy-Antwort außerhalb eines Callbacks haben, zum Beispiel in einer Middleware oder Pipeline, verwenden Sie den Konverter direkt:
from scrapling.integrations.scrapy import convert_response
scrapling_response = convert_response(scrapy_response, keep_comments=False)
Hinweise¶
- Geben Sie für weitere Seiten wie im Beispiel oben
scrapy.Request(response.urljoin(href))mit yield aus. Scraplings MethodeResponse.follow()erstellt Anfragen für das Spider-System von Scrapling, die Scrapy nicht versteht. - Das Wörterbuch
metader Antwort wird flach kopiert. Darin gespeicherte Objekte anderer Middlewares bleiben also erreichbar. Mitscrapy-playwrightist die Seite zum Beispiel weiterhin unterresponse.meta["playwright_page"]verfügbar. - Cookies werden aus den rohen
Set-Cookie-Headern gelesen und in das Wörterbuchcookiesder Antwort eingefügt.