Scrapy vs. Beautiful Soup

Vergleich zwischen Scrapy und Beautiful Soup. Erfahren Sie mehr über die beiden beliebten Optionen für das Web-Scraping.
9 min lesen
Scrapy vs Beautiful Soup

Wenn es um Web-Scraping geht, bietet Python eine große Auswahl an Tools. Selenium, MechanicalSoup, Scrapy, Requests, Beautiful Soup und lxml werden in diesem Zusammenhang häufig verwendet. Diese Tools sind jedoch nicht alle gleich, da jedes von ihnen seine eigenen Anwendungsfälle hat, in denen es sich besonders bewährt. Einige von ihnen ergänzen sich sogar, wie dieser Artikel zeigen wird.

In diesem Artikel werden Sie sich näher mit Scrapy und Beautiful Soup befassen, zwei beliebten Tools für das Web-Scraping.

Beautiful Soup ist eine Parsing-Bibliothek. Sie ermöglicht die Navigation in Dokumenten mithilfe von XPath- und CSS-Selektoren. Dies erleichtert die Umwandlung von Daten aus Markup-Sprachen (wie HTML und XML) in strukturierte Daten. Im Gegensatz dazu ist Scrapy ein vollständiges Web-Scraping-Framework, das ein Dokument lädt und (optional) speichert.

Erfahren Sie mehr über Web-Scraping mit Beautiful Soup.

In diesem Vergleich werden Sie die folgenden Aspekte berücksichtigen: Crawling-Benutzerfreundlichkeit, Scraping-Benutzerfreundlichkeit, Geschwindigkeit, mehrstufige Ausführung, Rotierender Proxy und CAPTCHA-Lösung.

Scrapy vs. Beautiful Soup: Schneller Vergleich

Wenn Sie es eilig haben, finden Sie hier einen schnellen Vergleich zwischen Scrapy und Beautiful Soup für das Web-Scraping mit Python.

Scrapy ist ein umfassendes Web-Scraping-Framework, das sich perfekt für groß angelegte Datenextraktionsprojekte eignet und integrierte Unterstützung für das Crawling bietet, während Beautiful Soup eine Parsing-Bibliothek ist, die sich am besten für kleinere, einfachere Scraping-Aufgaben ohne integrierte Crawling-Funktionen eignet.

Scrapy zeichnet sich durch Geschwindigkeit und Effizienz bei umfangreichen Scraping-Vorgängen aus, während Beautiful Soup durch Einfachheit und Benutzerfreundlichkeit bei schnellen Aufgaben glänzt. Wählen Sie Scrapy für komplexe Projekte oder Beautiful Soup für einfache, direkte Parsing-Anforderungen.

Scrapy

Scrapy ist eine All-in-One-Suite zum Crawlen des Webs, Herunterladen von Dokumenten, Verarbeiten dieser Dokumente und Speichern der resultierenden Daten in einem zugänglichen Format. Die Installation von Scrapy ist mit pip oder conda ganz einfach:

pip install scrapy
conda install -c conda-forge scrapy

Web-Crawling mit Scrapy

Scrapy hilft Ihnen beim Crawlen von Seiten und Websites, um URLs zum Scrapen zu sammeln oder um herauszufinden, ob eine Seite die gesuchten Informationen enthält. Scrapy arbeitet mit Spidern, also Python-Klassen, in denen man festlegen kann, wie eine Website navigiert werden soll, wie tief sie in die Website-Struktur vordringen soll, welche Daten sie extrahieren soll und wie diese gespeichert werden sollen. Um eine Liste von URLs zusammenzustellen, kann Scrapy HTML-, XML- und CSV-Dokumente navigieren und sogar Sitemaps laden.

Darüber hinaus bietet Scrapy die Scrapy-Shell, eine interaktive Shell zum Testen und Debuggen von XPath- und CSS-Ausdrücken auf bestimmten Seiten. Die Verwendung der Shell kann Ihnen Zeit beim Crawlen und Scraping sparen, da Sie den Spider nicht jedes Mal neu starten müssen, wenn Sie Änderungen vornehmen.

Web-Scraping mit Scrapy

Beim Scraping ist in der Regel ein hohes Maß an Flexibilität erforderlich. Scrapy bietet zwei Möglichkeiten zur Auswahl von Elementen in einem Dokument: über XPath- und CSS-Ausdrücke. Ersteres wird hauptsächlich für XML-Dokumente verwendet, während Letzteres ausschließlich für HTML-Dokumente gedacht ist.

Eine einzigartige Funktion von Scrapy ist die Möglichkeit, Pipelines zu definieren. Wenn ein Element gescrapt wird, kann es an eine Pipeline gesendet werden, in der eine Reihe von Aktionen durchgeführt werden: Bereinigung, Validierung, Hashing, Deduplizierung und Anreicherung.

Geschwindigkeit

Ein weiterer wichtiger Aspekt beim Web-Scraping ist die dafür benötigte Zeit. Die Geschwindigkeit von Scrapy zu beurteilen ist nicht einfach, da es viel Overhead hat, der verarbeitet werden muss. Aus diesem Grund wird der Overhead nur einmal geladen, während das Crawling und Extrahieren zehnmal erfolgt.

Im folgenden Beispiel wird das h2 einer einfachen (d. h. nicht dynamischen) Webseite extrahiert. Der gesamte Code wird in einem Jupyter Notebook ausgeführt.

Laden Sie zunächst die erforderlichen Scrapy-Bibliotheken:

import scrapy
from scrapy.crawler import CrawlerProcess

Richten Sie anschließend die Klasse „MySpider” ein, die den Scraping-Auftrag beschreibt:

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        'https://edition.cnn.com' # Oder wiederholen Sie dies 10 Mal, um die marginale Zeit zu berechnen.
    ]
    def parse(self, response):
        yield {'output': response.css('h2.container_lead-package__title_url-text::text').extract()}
process = CrawlerProcess(
    settings={
        "FEEDS": {
            "scrapy_output.json": {"format": "json", "overwrite": True}
        }
    })

process.crawl(MySpider)

Drittens: Führen Sie das Skript aus und messen Sie die Zeit:

%%timeit -n 1 -r 1
process.start()

Die Abfolge von Crawling, Scraping und Speichern eines einzelnen Webdokuments dauerte etwa 400 Millisekunden. Die zehnmalige Wiederholung desselben Vorgangs dauerte jedoch 1.200 Millisekunden. Das bedeutet, dass eine einzelne Sequenz etwa 80 Millisekunden dauert, was beeindruckend ist. Angesichts des Overheads sollte Scrapy Ihre erste Wahl für intensive Aufgaben sein.

Mehrstufiges Scraping mit Scrapy

Viele Websites, wenn nicht sogar die beliebtesten Websites wie X/Twitter, Substack und LinkedIn, sind dynamisch. Das bedeutet, dass große Mengen an Informationen hinter Anmeldeseiten, Suchanfragen, Pop-ups, Scrolls oder Mouseovers verborgen sind. Folglich reicht es oft nicht aus, dass Ihr Spider einfach eine Seite besucht, um Daten daraus zu extrahieren.

Scrapy bietet als eigenständiges Tool verschiedene Ansätze für die Bewältigung dieser Aufgaben. Man könnte die erforderlichen HTTP-Anfragen erstellen oder die entsprechenden JavaScript-Snippets ausführen. Die größte Flexibilität bietet jedoch die Verwendung eines Headless-Browsers. Beispielsweise gibt es Playwright- und Selenium-Integrationen für Scrapy, die für die Anbindung an dynamische Elemente verwendet werden können.

Proxy-Rotation und CAPTCHA-Vermeidung mit Scrapy

Das Aufkommen großer Sprachmodelle hat viele Unternehmen dazu motiviert, Modelle zu optimieren, aber dafür sind spezifische (oft gescrapte) Daten erforderlich. Darüber hinaus möchten viele Unternehmen nicht, dass Bots die Server ihrer Website belasten, und haben kein kommerzielles Interesse daran, ihre Daten weiterzugeben. Aus diesem Grund sind viele Websites nicht nur dynamisch aufgebaut, sondern verfügen auch über Anti-Scraping-Technologien wie automatische IP-Blockierung und CAPTCHA.

Um eine Sperrung zu verhindern, bietet Scrapy keine sofort einsatzbereiten Tools für die Rotation von Rotierenden Proxys (und IP-Adressen) an. Scrapy kann jedoch durch das Middleware-Framework erweitert werden, eine Reihe von Hooks zur Änderung des Anfrage- und Antwortprozesses von Scrapy. Um Proxys zu rotieren, kann man ein Python-Modul wie scrapy-rotating-proxies hinzufügen, das speziell für diesen Zweck entwickelt wurde. Durch denselben Mechanismus kann man das DeCAPTCHA-Modul hinzufügen.

Beautiful Soup

Im Gegensatz zu Scrapy bietet Beautiful Soup keine Komplettlösung für die Extraktion und Verarbeitung von Daten aus Webdokumenten, sondern nur den Scraping-Teil. Sie müssen lediglich ein heruntergeladenes Dokument einspeisen, und Beautiful Soup kann es mithilfe von CSS- und XPath-Selektoren in strukturierte Daten umwandeln.

Die Installation von Beautiful Soup kann über pip und conda erfolgen:

pip install BeautifulSoup4
conda install -c anaconda beautifulsoup4

Web-Crawling mit Beautiful Soup

Während Scrapy Spiders einsetzt, um eine Website zu durchsuchen, bietet Beautiful Soup keine solchen Funktionen. Mit etwas Python-Kreativität und unter Verwendung von Beautiful Soup und der Requests-Bibliothek kann man jedoch ein Skript schreiben, um eine Website bis zu einer bestimmten Tiefe zu durchsuchen. Dennoch ist dies sicherlich nicht so einfach wie mit Scrapy.

Web-Scraping mit Beautiful Soup

Web-Scraping ist das, was Beautiful Soup 4 auszeichnet. Es bietet nicht nur CSS- und XPath-Selektoren, sondern auch eine Vielzahl von Methoden zum Durchlaufen von Dokumenten. Wenn Dokumente eine komplexe Struktur haben, können Methoden wie .parent und .next_sibling Elemente extrahieren, die sonst schwer zu erreichen sind. Zusätzlich können Sie mit find_all() und ähnlichen Methoden Textfilter, reguläre Ausdrücke und sogar benutzerdefinierte Funktionen festlegen, um die erforderlichen Elemente zu finden.

Schließlich verfügt Beautiful Soup über verschiedene Ausgabeformatierer, um die Ausgabe zu formatieren, zu kodieren, Microsofts Smart Quotes zu entfernen und sogar HTML zu parsen und zu validieren.

Geschwindigkeit

Im Gegensatz zu Scrapy haben Requests und Beautiful Soup keinen Overhead und können einfach zehnmal ausgeführt werden, um ihre Geschwindigkeit zu beurteilen.

Laden Sie zunächst die erforderlichen Bibliotheken:

import requests, json
from bs4 import BeautifulSoup

Als Nächstes messen Sie die Zeit des Codes, indem Sie ihn in einen timeit-Magiebefehl einbetten:

%%timeit -n 10 -r 1
page = requests.get('https://edition.cnn.com')
page_html = BeautifulSoup(page.text, 'html.parser')
page_html = page_html.select_one('h2.container_lead-package__title_url-text').text
json_object = json.dumps({'output': page_html})
with open("bs4_output.json", "w") as output_file:
    output_file.write(json_object)

Die einmalige Ausführung dauert etwa 300 Millisekunden. Die zehnmalige Ausführung dauert 3.000 Millisekunden, was deutlich langsamer ist als Scrapy. Allerdings erfordert es viel weniger Konfiguration und relativ wenig Kenntnisse über ein bestimmtes Framework.

Mehrstufiges Scraping mit Beautiful Soup

Da Beautiful Soup keine Crawling-Funktionen hat, kann es natürlich keine dynamischen Webseiten verarbeiten. Wie Scrapy funktioniert es jedoch perfekt mit Automatisierungstools wie Playwright, Puppeteer und Selenium zusammen. Die Kombination von Automatisierungstools mit Beautiful Soup funktioniert immer auf die gleiche Weise: Die Headless-Browser verarbeiten die dynamischen Elemente, während Beautiful Soup die gerenderten Daten in diesen Browsern extrahiert.

Proxy-Rotation und CAPTCHA-Verhinderung mit Beautiful Soup

Da Beautiful Soup ein Scraping-Tool und kein Crawling-Tool ist, bietet es keine Tools, um zu verhindern, dass man von den Servern einer Website blockiert wird. Wenn Sie dies benötigen, sollten diese Funktionen Teil des von Ihnen gewählten Crawling-Tools sein.

Fazit

Dieser Artikel hat dargelegt, wie sich Beautiful Soup und Scrapy in Bezug auf Geschwindigkeit, Umgang mit dynamischen Webdokumenten und Umgehung von Anti-Scraping-Maßnahmen in ihrer Verwendbarkeit für Web-Crawling und Web-Scraping unterscheiden.

Als End-to-End-Tool ist Scrapy der klare Favorit für alltägliche Scraping-Aufgaben. Allerdings benötigt es einige Middleware, um dynamische Websites zu scrapen und sicherzustellen, dass man nicht blockiert wird.

Obwohl Beautiful Soup (zusammen mit dem Request-Paket) recht langsam ist, bietet es eine sehr vertraute und einfache Möglichkeit für Ad-hoc-Scraping-Aufgaben. Wie Scrapy erfordert es zusätzliche Tools für das Scraping dynamischer Websites und die Vermeidung von Blockierungen.

Wenn Sie nach einer Komplettlösung für das Web-Scraping suchen, sollten Sie Bright Data in Betracht ziehen. Bright Data bietet zahlreiche Produkte wie Proxy-Dienste und Web Unlocker, die Sie bei all Ihren Web-Scraping-Anforderungen unterstützen, unabhängig davon, für welche Option Sie sich entscheiden.

Möchten Sie erfahren, wie Sie Bright Data-Proxys integrieren können? Lesen Sie unseren Leitfaden zur Integration von Scrapy-Proxys und BeautifulSoup-Proxys.