Logo of Scrapy.

Wie man eine Webseite mit Python + Scrapy in 5 einfachen Schritten scrapt

Wir können eine Website zu einem festen Preis für Sie erstellen! Bitte kontaktieren Sie mich, wenn Sie interessiert sind.

In diesem Python Scrapy-Tutorial lernen Sie, wie Sie mit dem Scrapy-Framework einen einfachen Webskraper in Python schreiben. Die Data Blogger-Website wird in diesem Artikel als Beispiel verwendet.

Scrapy: An open source and collaborative framework for extracting the data you need from websites. In a fast, simple, yet extensible way.

Einführung

In this tutorial we will build the webscraper using only Scrapy + Python 3 (or Python 2) and no more! The tutorial has both Python 2 and Python 3 support. The possibilities are endless. Beware that some webscrapes are not legal! For example, although it is possible, it is not allowed to use Scrapy or any other webscraper to scrape LinkedIn (https://www.linkedin.com/). However, LinkedIn lost in one case in 2017.

Inhalt + Link-Extraktor

Der Zweck von Scrapy ist es, Inhalte und Links von einer Website zu extrahieren. Dies geschieht durch rekursives Befolgen aller Links auf der jeweiligen Website.

Schritt 1: Scrapy installieren

Laut der Website von Scrapy müssen wir nur den folgenden Befehl ausführen, um Scrapy zu installieren:

pip install scrapy

Schritt 2: Einrichten des Projekts

Jetzt erstellen wir die Ordnerstruktur für Ihr Projekt. Für den Data Blogger-Scraper wird der folgende Befehl verwendet. Sie können datablogger_scraper in den Namen Ihres Projekts ändern.

scrapy startproject datablogger_scraper

Schritt 3: Erstellen eines Objekts

Das nächste, was zu tun ist, ist eine Spinne zu erstellen, die die Website (n) von Interesse crawlen wird. Die Spinne muss wissen, welche Daten gecrawlt werden. Diese Daten können in ein Objekt eingefügt werden. In diesem Tutorial werden wir interne Links einer Website crawlen. Ein Link ist definiert als ein Objekt mit einer Quell-URL und einer Ziel-URL. Die Quell-URL ist die URL, auf der der Link gefunden werden kann. Es hat auch eine Ziel-URL, zu der der Link navigiert, wenn darauf geklickt wird. Ein Link wird als interner Link bezeichnet, wenn sowohl die Quell-URL als auch die Ziel-URL auf der Website selbst enthalten sind.

Scrape-Objekt-Implementierung

Das Objekt ist in items.py definiert und für dieses Projekt hat items.py folgenden Inhalt:

import scrapy

class DatabloggerScraperItem(scrapy.Item):
    # The source URL
    url_from = scrapy.Field()
    # The destination URL
    url_to = scrapy.Field()

Beachten Sie, dass Sie jedes Objekt definieren können, das Sie crawlen möchten! Zum Beispiel können Sie ein Objekt Game Console (mit den Eigenschaften “Hersteller”, “Preis” und “Veröffentlichungsdatum”) angeben, wenn Sie eine Website über Game Consoles scrapen. Wenn Sie Informationen über Musik von mehreren Websites scrapen, können Sie ein Objekt mit Eigenschaften wie “Künstler”, “Veröffentlichungsdatum” und “Genre” definieren. Auf LinkedIn könnte man eine “Person” mit den Eigenschaften “Bildung”, “Arbeit” und “Alter” abkratzen.

Schritt 4: Erstellen der Spinne

Jetzt haben wir die Daten in ein Objekt eingekapselt, wir können mit der Erstellung der Spinne beginnen. Zuerst navigieren wir zum Projektordner. Dann führen wir den folgenden Befehl aus, um eine Spinne zu erstellen (die sich dann im Verzeichnis spiders / befindet):

scrapy genspider datablogger data-blogger.com 

Spinne Implementierung

Jetzt wird eine Spinne erstellt (spiders/datablogger.py). Sie können diese Datei beliebig anpassen. Ich habe den folgenden Code erhalten:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor
from scrapy.spiders import Rule, CrawlSpider
from datablogger_scraper.items import DatabloggerScraperItem


class DatabloggerSpider(CrawlSpider):
    # The name of the spider
    name = "datablogger"

    # The domains that are allowed (links to other domains are skipped)
    allowed_domains = ["data-blogger.com"]

    # The URLs to start with
    start_urls = ["https://www.data-blogger.com/"]

    # This spider has one rule: extract all (unique and canonicalized) links, follow them and parse them using the parse_items method
    rules = [
        Rule(
            LinkExtractor(
                canonicalize=True,
                unique=True
            ),
            follow=True,
            callback="parse_items"
        )
    ]

    # Method which starts the requests by visiting all URLs specified in start_urls
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, dont_filter=True)

    # Method for parsing items
    def parse_items(self, response):
        # The list of items that are found on the particular page
        items = []
        # Only extract canonicalized and unique links (with respect to the current page)
        links = LinkExtractor(canonicalize=True, unique=True).extract_links(response)
        # Now go through all the found links
        for link in links:
            # Check whether the domain of the URL of the link is allowed; so whether it is in one of the allowed domains
            is_allowed = False
            for allowed_domain in self.allowed_domains:
                if allowed_domain in link.url:
                    is_allowed = True
            # If it is allowed, create a new item and add it to the list of found items
            if is_allowed:
                item = DatabloggerScraperItem()
                item['url_from'] = response.url
                item['url_to'] = link.url
                items.append(item)
        # Return all the found items
        return items

Ein paar Dinge sind erwähnenswert. Der Crawler erweitert das CrawlSpider-Objekt, das über eine Parse-Methode zum rekursiven Scraping einer Website verfügt. Im Code ist eine Regel definiert. Diese Regel weist den Crawler an, allen gefundenen Links zu folgen. Die Regel gibt auch an, dass nur eindeutige Links analysiert werden, so dass keiner der Links doppelt analysiert wird! Darüber hinaus stellt die Eigenschaft canonicalize sicher, dass Links nicht zweimal analysiert werden.

LinkExtraktor

Der LinkExtractor ist ein Modul mit dem Zweck, Links von Webseiten zu extrahieren.

Schritt 5: Ausführen der Spinne

Wechseln Sie zum Stammordner Ihres Projekts. Führen Sie dann den folgenden Befehl aus:

scrapy crawl datablogger -o links.csv -t csv

Dieser Befehl wird dann über Ihre Website ausgeführt und generiert eine CSV-Datei zum Speichern der Daten. In meinem Fall habe ich eine CSV-Datei namens links.csv mit folgendem Inhalt:

url_from,url_to
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/cern/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,http://www.data-blogger.com/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/data-science/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/software-science/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/mathematics/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/projects/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/competition/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/about-me/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/contact/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/hire-me/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/author/admin/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.facebook.com/sharer/sharer.php?t=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&u=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://twitter.com/intent/tweet?text=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://plus.google.com/share?url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/cluster/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/isa/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/monitoring/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/software/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/17/cern-deel-3-trip-naar-zurich/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/19/project-euler-using-scala-problem-1/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/08/13/apache-flink-the-next-distributed-data-processing-revolution/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/24/summing-the-fibonacci-sequence/
https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/2016/07/17/why-scala/
https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/
...

Fazit

Es ist relativ einfach, mit Scrapy eine eigene Spinne zu schreiben. Sie können die Daten angeben, die Sie in einem Objekt abkratzen möchten, und Sie können das Verhalten Ihres Crawlers angeben. Wenn Sie irgendwelche Fragen haben, zögern Sie nicht, sie im Kommentarbereich zu fragen!