[100 Tage Python-Kenntnisse] Tag 45: Python-Webcrawler-Entwicklung_ Scrapy-Crawler-Framework

Inhaltsverzeichnis

1 Einführung in Scrapy

2 Scrapy-Selektoren

3 Erstellen Sie schnell einen Scrapy-Crawler

4 Downloader- und Crawler-Middleware

5 Verwendung von Pipelines


1 Einführung in Scrapy

Scrapy ist ein Open-Source-Webcrawler-Framework zum Crawlen von Website-Daten und zum Durchführen der Datenextraktion. Es ist in der Programmiersprache Python geschrieben und bietet leistungsstarke Tools und Bibliotheken, die Benutzern beim Durchsuchen und Scrapen von Daten im Web helfen. Scrapy zielt darauf ab, den Crawler-Entwicklungsprozess zu vereinfachen und bietet einen hochgradig anpassbaren Mechanismus, um die Daten-Scraping-Anforderungen verschiedener Websites zu erfüllen.

Im Folgenden sind einige der Hauptfunktionen und Komponenten des Scrapy-Frameworks aufgeführt:

  1. Anforderungs- und Antwortverwaltung: Scrapy bietet ein asynchrones Anforderungs- und Antwortverwaltungssystem, mit dem Benutzer HTTP-Anfragen stellen und den zurückgegebenen HTML-Code oder andere Daten verarbeiten können.

  2. Datenextraktion: Scrapy verwendet Datenextraktionsmethoden basierend auf XPath- oder CSS-Selektoren, sodass Benutzer die erforderlichen Daten einfach aus Webseiten extrahieren können.

  3. Middleware: Mit Scrapy können Benutzer Middleware definieren, um die Verarbeitung von Anforderungen und Antworten anzupassen, z. B. das Ändern von Anforderungsheadern, das Verarbeiten von Proxys usw.

  4. Pipeline: Pipeline ist eine Komponente zur Verarbeitung von Daten in Scrapy. Sie können die erfassten Daten in der Pipeline bereinigen, verarbeiten und speichern.

  5. Planer: Der Planer ist dafür verantwortlich, die Reihenfolge zu verwalten, in der Anfragen gesendet werden, und wie gleichzeitige Anfragen verarbeitet werden, um sicherzustellen, dass Crawler mit einer angemessenen Geschwindigkeit auf Websites zugreifen.

  6. Automatische Geschwindigkeitsbegrenzung: Scrapy verfügt über eine automatische Geschwindigkeitsbegrenzungsfunktion, um eine übermäßige Belastung der Zielwebsite zu vermeiden.

  7. Asynchrone Unterstützung: Scrapy unterstützt die asynchrone Verarbeitung und ermöglicht so die effiziente Ausführung mehrerer Anforderungen und Verarbeitungsvorgänge.

  8. Erweiterbarkeit: Sie können Erweiterungen schreiben, um das Verhalten von Scrapy nach Bedarf anzupassen, z. B. durch das Hinzufügen neuer Middleware, Pipelines usw.

  9. Befehlszeilentools: Scrapy bietet Benutzern Befehlszeilentools zum Erstellen, Verwalten und Ausführen von Crawlern.

  10. Umfangreiche Dokumentation: Scrapy bietet detaillierte offizielle Dokumentationen und Tutorials, um neuen Benutzern einen schnellen Einstieg zu ermöglichen, und stellt Ressourcen für fortgeschrittene Benutzer bereit, um das Framework eingehend zu verstehen.

Zusammenfassend lässt sich sagen, dass Scrapy ein leistungsstarkes und hochgradig anpassbares Webcrawler-Framework ist, das sich für Daten-Scraping-Projekte jeder Größe eignet, von einfachen Datenerfassungsaufgaben bis hin zu komplexem Data Mining und Analysen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, können Sie mit Scrapy Crawler schnell und effizient erstellen und verwalten.

2 Scrapy-Selektoren

        Scrapy bietet zwei Hauptselektoren zum Extrahieren von Daten aus Webseiten: XPath-basierte Selektoren und CSS-basierte Selektoren. Mit beiden Selektoren können Sie die gewünschten Daten einfach aus einem HTML- oder XML-Dokument finden und extrahieren.

  1. XPath-basierte Selektoren: XPath (XML Path Language) ist eine Sprache zum Auffinden von Elementen in XML-Dokumenten. In Scrapy können Sie mit XPath-Selektoren Daten über Pfadausdrücke auswählen und extrahieren. Hier sind einige Beispiele für gängige XPath-Ausdrücke:

    • Elemente auswählen: //elementName(alle Elemente mit dem Namen elementName auswählen)
    • Elemente unter einem bestimmten Pfad auswählen: //parent/child(alle untergeordneten Elemente unter dem übergeordneten Element auswählen)
    • Elemente mit einem bestimmten Attribut auswählen: //element[@attribute='value'](Elemente mit Attribut Attribut und Wertwert auswählen)
  2. CSS-basierte Selektoren: CSS-Selektoren (Cascading Style Sheets) werden häufig für die Gestaltung im Webdesign verwendet, können aber auch zum Auswählen von Elementen aus HTML-Dokumenten verwendet werden. Mit CSS-Selektoren in Scrapy können Sie Daten mithilfe einer CSS-Selektor-ähnlichen Syntax suchen und extrahieren. Hier sind einige Beispiele für gängige CSS-Selektoren:

    • Elemente auswählen: elementName(alle Elemente mit dem Namen elementName auswählen)
    • Klasse auswählen: .className(Alle Elemente mit Klassenname Klasse auswählen)
    • ID auswählen: #idName(Elemente mit idName ID auswählen)
    • Wählen Sie die Elemente unter dem Pfad aus: parent > child(wählen Sie alle untergeordneten Elemente unter dem übergeordneten Element aus)

In Scrapy können Sie diese Selektoren verwenden, um Daten von Webseiten zu finden und zu extrahieren. Hier ist ein Beispielcode mit Scrapy-Selektoren:

from scrapy.selector import Selector

html_content = """
<html>
  <body>
    <div class="container">
      <h1>Title</h1>
      <p>Paragraph 1</p>
      <p>Paragraph 2</p>
    </div>
  </body>
</html>
"""

selector = Selector(text=html_content)

# 使用 XPath 选择器提取数据
title = selector.xpath("//h1/text()").get()
paragraphs = selector.xpath("//p/text()").getall()

# 使用 CSS 选择器提取数据
title = selector.css("h1::text").get()
paragraphs = selector.css("p::text").getall()

Unabhängig davon, ob Sie sich für die Verwendung von XPath- oder CSS-Selektoren entscheiden, bietet Scrapy praktische Methoden zum Extrahieren der erforderlichen Daten aus Webseiten und macht so Daten-Scraping-Aufgaben einfacher und effizienter. 

3 Erstellen Sie schnell einen Scrapy-Crawler

        Das Erstellen eines einfachen Scrapy-Crawlers kann in die folgenden Schritte unterteilt werden. Das folgende Beispiel führt Sie durch die Erstellung eines einfachen Crawlers, der berühmte Zitate crawlt.

  1. Scrapy installieren: Zunächst müssen Sie sicherstellen, dass Python und Scrapy installiert sind. Wenn Sie Scrapy nicht installiert haben, können Sie es mit dem folgenden Befehl installieren:
pip install scrapy

Erstellen Sie ein neues Scrapy-Projekt: Navigieren Sie in der Befehlszeile zu dem Verzeichnis, in dem Sie das Projekt erstellen möchten, und führen Sie den folgenden Befehl aus, um ein neues Scrapy-Projekt zu erstellen:

scrapy startproject quotes_spider

Dadurch wird im aktuellen Verzeichnis ein Projektverzeichnis mit dem Namen „quotes_spider“ erstellt.

(1) Erstellen Sie einen Crawler: Geben Sie im Projektverzeichnis das Verzeichnis „quotes_spider“ ein und führen Sie den folgenden Befehl aus, um einen Crawler zu erstellen:

cd quotes_spider
scrapy genspider quotes quotes.toscrape.com

Dadurch wird ein Crawler namens „quotes“ erstellt, der Daten von der Website „quotes.toscrape.com“ extrahiert.

(2) Bearbeiten Sie den Crawler-Code: Suchen Sie die Datei „quotes.py“ im Verzeichnis „quotes_spider/spiders“, bei der es sich um die neu erstellte Crawler-Datei handelt. Öffnen Sie diese Datei mit Ihrem bevorzugten Editor und bearbeiten Sie die Methoden start_urlsund :parse

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

In diesem Beispiel-Crawler crawlen wir den berühmten Zitattext und die Autoreninformationen von der berühmten Zitat-Website. parseDie Methode ist dafür verantwortlich, Daten von der Webseite zu extrahieren und response.followmithilfe der Methode dem Link zur nächsten Seite zu folgen.

(3) Führen Sie den Crawler aus: Gehen Sie zurück zum Projektverzeichnis („quotes_spider“-Verzeichnis) und führen Sie den folgenden Befehl aus, um den Crawler auszuführen:

scrapy crawl quotes

        Der Crawler beginnt mit dem Besuch der Start-URL, erfasst Daten und zeigt sie auf dem Terminal an.

        Dies ist ein einfaches Beispiel für den Erstellungsprozess des Scrapy-Crawlers. Tatsächlich können Sie jeden Aspekt des Crawlers entsprechend Ihren Anforderungen anpassen, einschließlich Anforderungsheadern, Pipelines, Middleware usw. Wenn Sie die offizielle Dokumentation von Scrapy lesen, erhalten Sie Einblicke in die Erstellung komplexerer und individuellerer Crawler.

4 Downloader- und Crawler-Middleware

        Im Scrapy-Framework sind Downloader-Middleware und Crawler-Middleware zwei verschiedene Arten von Middleware, die zum Einfügen benutzerdefinierter Logik in den Anforderungs-/Antwortverarbeitungsfluss verwendet werden. Sie befinden sich im Prozess des Sendens von Anfragen bzw. des Empfangens von Antworten und ermöglichen es Ihnen, Netzwerkanfragen und Datenverarbeitung zu ändern und zu steuern.

Downloader-Middleware (Downloader-Middleware): Die Downloader-Middleware befindet sich im Anforderungssendeprozess und ist für die Verarbeitung der Anforderung und des Vorgangs verantwortlich, bevor die Antwort zurückgegeben wird. Diese Middleware kann zum Ändern von Anforderungsheadern, zum Festlegen eines Proxys, zum Verwalten von Cookies usw. verwendet werden. Downloader-Middleware kann global oder crawlerspezifisch konfiguriert werden.

Zu den gängigen Vorgängen der Downloader-Middleware gehören:

  • Ändern Sie Anforderungsheader, um verschiedene Arten von Browseranforderungen zu simulieren.
  • Konfigurieren Sie einen Proxyserver, um die tatsächliche IP-Adresse des Crawlers zu verbergen.
  • Verarbeitet Cookies, um den Sitzungsstatus aufrechtzuerhalten.
  • Wiederholungsversuche und Fehlerbehandlung für Anfragen.
  • Steuert die Parallelität von Anfragen.

Spider Middleware: Spider Middleware befindet sich im Antwortempfangs- und Datenverarbeitungsprozess und ist für die Verarbeitung der Antwort und der extrahierten Daten verantwortlich. Diese Middleware kann verwendet werden, um die gecrawlten Daten zu ändern, Ausnahmen zu behandeln, Datenkonvertierungen durchzuführen usw. Die Crawler-Middleware kann global oder crawlerspezifisch konfiguriert werden.

Zu den gängigen Crawler-Middleware-Vorgängen gehören:

  • Aus Webseiten extrahierte Daten vorverarbeiten und bereinigen.
  • Benutzerdefinierte Datenkonvertierung, z. B. Datumsformatierung, Textverarbeitung usw.
  • Behandeln Sie Anomalien, z. B. die Verarbeitungsstrategie für blockierte IP-Adressen.
  • Kontrollieren Sie den Datenfluss und die Filterung.

Die Konfiguration der Middleware settings.pyerfolgt in der Scrapy-Datei. Sie können für jede Middleware eine Priorität festlegen, um deren Reihenfolge im Verarbeitungsfluss zu bestimmen. Genauer gesagt verarbeitet die Downloader-Middleware mit höherer Priorität zuerst Anfragen, während die Crawler-Middleware mit höherer Priorität zuerst Antworten und extrahierte Daten verarbeitet.

Hier ist ein einfaches Beispiel, das zeigt, wie die Downloader- und Crawler-Middleware konfiguriert wird:

# settings.py

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.MyDownloaderMiddleware': 543,
}

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.MySpiderMiddleware': 543,
}

        Im obigen Beispiel handelt es sich bei myproject.middlewares.MyDownloaderMiddlewareund myproject.middlewares.MySpiderMiddlewareum benutzerdefinierte Downloader- bzw. Crawler-Middleware. Ihre Priorität ist auf 543 eingestellt.

        Mithilfe der Downloader- und Crawler-Middleware können Sie benutzerdefinierte Logik in den Anforderungs- und Antwortverarbeitungsablauf einfügen, um einen flexibleren und effizienteren Crawler zu erhalten, der Ihren Anforderungen entspricht.

5 Verwendung von Pipelines

        In Scrapy ist Pipeline (Pipeline) eine Komponente, die zum Verarbeiten der von Crawlern gecrawlten Daten verwendet wird. Es ermöglicht Ihnen die Durchführung mehrerer Vorgänge während des Daten-Crawlings vom Crawler bis zur endgültigen Speicherung oder Verarbeitung, wie z. B. Datenbereinigung, Validierung, Speicherung in der Datenbank, Export in eine Datei usw. Die Pipelines von Scrapy bieten eine flexible und anpassbare Möglichkeit, Scraped-Datenströme zu verarbeiten.

So verwenden Sie die Pipeline zum Verarbeiten der Scraping-Daten:

(1) Aktivieren Sie die Pipeline: In der Konfigurationsdatei von Scrapy ( settings.py) müssen Sie die Pipeline aktivieren und konfigurieren. Sie können ITEM_PIPELINESin den Einstellungen angeben, welche Pipeline-Klasse verwendet werden soll und welche Priorität sie hat. Priorität ist ein ganzzahliger Wert, wobei kleinere Werte eine höhere Priorität anzeigen.

# settings.py

ITEM_PIPELINES = {
    'myproject.pipelines.MyPipeline': 300,
}

Im obigen Beispiel myproject.pipelines.MyPipelinehandelt es sich um Ihre benutzerdefinierte Pipelineklasse und die Priorität ist auf 300 festgelegt.

(2) Erstellen Sie eine Pipeline-Klasse: Erstellen Sie im Projekt eine Pipeline-Klasse, die die vom Crawler erfassten Daten verarbeitet. Sie müssen einige Methoden implementieren, um mit den Daten arbeiten zu können, z. B. process_itemdie Methode.

# pipelines.py

class MyPipeline:
    def process_item(self, item, spider):
        # 在这里处理数据,可以进行清洗、验证、存储等操作
        return item

Im obigen Beispiel process_itemempfängt die Methode zwei Parameter: itemdas vom Crawler erfasste Datenelement spiderund die aktuelle Crawler-Instanz.

(3) Datenverarbeitung: In der Methode der Pipeline-Klasse process_itemkönnen Sie verschiedene Vorgänge an den Daten durchführen, z. B. Datenbereinigung, Formatierung und Überprüfung. Sie können Daten auch in einer Datenbank speichern, in eine Datei exportieren und vieles mehr.

Das Folgende ist ein einfaches Beispiel, das zeigt, wie gecrawlte Daten in einer Pipeline verarbeitet und in einer JSON-Datei gespeichert werden:

# pipelines.py

import json

class MyPipeline:
    def open_spider(self, spider):
        self.file = open('data.json', 'w')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        data = {
            'text': item['text'],
            'author': item['author']
        }
        json.dump(data, self.file)
        self.file.write('\n')
        return item

Im obigen Beispiel werden open_spiderdie close_spiderMethoden und zu Beginn und am Ende des Crawls aufgerufen und öffnen bzw. schließen die Datendatei. process_itemDie Methode extrahiert und speichert die Daten in einer JSON-Datei.

Durch das Konfigurieren und Schreiben benutzerdefinierter Pipeline-Klassen können Sie verschiedene Vorgänge an den gecrawlten Daten ausführen und so einen hochgradig angepassten Datenverarbeitungsprozess realisieren.

Guess you like

Origin blog.csdn.net/qq_35831906/article/details/132411515