Heim BlogWeb-Scraping Die 8 besten Python-Bibliotheken und Tools für Web Scraping im Jahr 2023

Die 8 besten Python-Bibliotheken und Tools für Web Scraping im Jahr 2023

von Kadek

Python ist eine der am häufigsten verwendeten Programmiersprachen für Scraping, Datenwissenschaft und maschinelles Lernen. Da es recht einfach zu erlernen ist, ist es auch für diejenigen geeignet, die noch nie zuvor programmiert haben.

Python verfügt über eine Reihe von Bibliotheken zum Daten-Scraping, mit denen Sie das Schreiben von Skripten vereinfachen können. Wir haben zu diesem Thema bereits einen Einführungsartikel geschrieben, aber heute konzentrieren wir uns detaillierter auf acht der besten Python-Web-Scraping-Bibliotheken.

Um zu verstehen, welche der überprüften Bibliotheken am beliebtesten ist, haben wir die Download-Statistiken für einige der beliebtesten Python-Web-Scraping-Bibliotheken der letzten drei Jahre gesammelt. Durch die Analyse dieser Trends können wir Einblicke in die sich entwickelnden Bedürfnisse von Web-Scraping-Entwicklern und in die Art und Weise gewinnen, wie sie ihre bevorzugten Bibliotheken auswählen.

Die Grafik zeigt, dass Requests und UrlLib3 deutlich mehr Downloads haben als andere Python-Bibliotheken für Web Scraping. Dies liegt nicht nur an ihrer Beliebtheit in Web-Scraping-Projekten, sondern auch daran, dass sie häufig in vielen anderen Python-Projekten verwendet werden, bei denen es um die Interaktion mit Websites geht. Insbesondere Requests ist eine weit verbreitete HTTP-Bibliothek für Python und wird häufig für API-Anfragen und webbasierte Anwendungen verwendet. UrlLib3 hingegen ist eine leistungsstarke Bibliothek zum Umgang mit URLs und wird häufig zum Parsen, Lesen und Öffnen von URLs verwendet.

Es ist interessant festzustellen, dass je beliebter eine Bibliothek ist, desto einfacher ist sie und desto weniger Funktionalität bietet sie. Dies könnte daran liegen, dass einfachere Bibliotheken eine geringere Einstiegshürde bieten und Entwicklern mit weniger Erfahrung einen schnellen Einstieg ermöglichen. Darüber hinaus sind die komplexeren Bibliotheken auf größere Projekte ausgerichtet und erfordern für eine effektive Nutzung mehr technisches Wissen. Das bedeutet, dass diejenigen, die die zusätzlichen Funktionen oder die Leistung dieser Tools nicht benötigen, sich stattdessen für einfachere Lösungen entscheiden.

TOP 8 Python-Web-Scraping-Bibliotheken

Hier sind die besten Python-Bibliotheken und Frameworks für Web Scraping, die Ihnen beim Extrahieren von Daten von Websites helfen.

URLLib3

UrlLib3 ist eine Python-Bibliothek zum Arbeiten mit Abfragen. Es verfügt über einen recht umfangreichen Funktionsumfang und unterstützt eine Reihe von Funktionen für die Arbeit mit Abfragen.

Vorteile

UrlLib3 ist eine leistungsstarke Abfragebibliothek. Es hat viele Vorteile, wie zum Beispiel:

  1. Organisation und Unterstützung sicherer Streams.
  2. Überprüfung von SSL/TLS auf der Clientseite.
  3. Unterstützung für Verbindungspools.
  4. Erstellen wiederholter Abfragen.
  5. Proxy für HTTP und SOCKS.

Aus diesem Grund wurde die Bibliothek schnell zu einer der beliebtesten und am häufigsten verwendeten in Python.

Nachteile

Leider hat UrlLib trotz der Vorteile eine Reihe von Nachteilen:

  1. Es weiß nicht, wie Daten verarbeitet werden sollen, und eignet sich daher nicht zum Scrapen als unabhängige Bibliothek.
  2. Im Vergleich zur Requests-Bibliothek ist sie nicht benutzerfreundlich.
  3. Der Verbindungspool urllib3 erschwert die Arbeit mit Cookies, da es sich nicht um einen Client mit Statusverfolgung handelt.

Verwendung

Die UrlLib-Bibliothek wird zum Bearbeiten von Abfragen sowie zum Empfangen und Senden von Daten verwendet. Funktioniert gut mit Proxy.

Um zu verstehen, wie man es zum Schaben verwendet, schreiben wir einen einfachen Schaber.

Installieren der URLLib3-Bibliothek

Lassen Sie uns die Bibliothek installieren, indem wir den folgenden Befehl in der Befehlszeile ausführen:

pip install urllib3

Wenn die Installation erfolgreich war, erscheint die folgende Meldung:

C:\Users\user>pip install urllib3
Collecting urllib3
  Downloading urllib3-1.26.15-py2.py3-none-any.whl (140 kB)
     ---------------------------------------- 140.9/140.9 kB 832.1 kB/s eta 0:00:00
Installing collected packages: urllib3
Successfully installed urllib3-1.26.15

Wenn Sie auf Schwierigkeiten stoßen, stellen Sie sicher, dass der Python-Interpreter installiert ist. Geben Sie dazu in der Befehlszeile den folgenden Befehl ein:

python -V

Wenn die Interpreterversion angezeigt wird, ist dies nicht das Problem. In diesem Fall sollten Sie den Hinweisen aus dem Fehler folgen.

Verwendung der URLLib3-Bibliothek

Um die UrlLib3-Bibliothek verwenden zu können, muss sie in eine Skriptdatei eingebunden werden. Erstellen Sie dazu eine Datei mit beliebigem Namen und der Erweiterung *.py und fügen Sie die erste Codezeile hinzu:

import urllib3

Nachdem die Bibliothek nun installiert und verbunden ist, führen wir eine Anfrage aus, um den Code der Website-Seite abzurufen. Zur Überprüfung und zum Testen verwenden wir die Anfragen an https://example.com/.

Erstellen Sie einen Verbindungsmanager und speichern Sie ihn in der http-Variablen:

http = urllib3.PoolManager()

Dieser Teil des Codes ermöglicht die Verbindung zur Website und den Abruf von Daten. Die Anfrage selbst wird als einzelne Zeile ausgeführt und besteht aus zwei Teilen: der Anfragemethode und dem Link, über den die Anfrage ausgeführt werden soll:

resp = http.request('GET', 'https://example.com')

Das Ergebnis der Abfrage wird in der Variablen bzw. Variablen gespeichert. Um das Abfrageergebnis zu sehen, zeigen wir es auf dem Bildschirm an:

print(resp.data)

Ein solcher Befehl gibt das Ergebnis so aus, wie es empfangen wurde, also in einer Zeile:

D:\scripts>urllib3_test.py

b'<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset="utf-8" />\n    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n    <meta name="viewport" content="width=device-width, initial-scale=1" />\n    <style type="text/css">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'

Um den resultierenden Code der Seite in einer praktischen Form auszugeben, muss er dekodiert werden:

print(resp.data.decode('utf-8'))

Das Ergebnis einer solchen Abfrage:

D:\scripts>urllib3_test.py
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
      …
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>
<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

Der Skriptcode:

import urllib3
http = urllib3.PoolManager()
resp = http.request('GET', 'https://example.com')
print(resp.data.decode('utf-8'))

Als nächstes verarbeiten wir den resultierenden Code, um nur nützliche Daten zu extrahieren. Nutzen Sie dazu spezielle Bibliotheken oder nutzen Sie reguläre Ausdrücke.

Da reguläre Ausdrücke universeller sind und wir später spezielle Bibliotheken verwenden werden, betrachten wir die Datenverarbeitung mit regulären Ausdrücken.

Datenverarbeitung mit regulären Ausdrücken

Die RE-Bibliothek wird zum Arbeiten mit regulären Ausdrücken verwendet. Es ist vorinstalliert. Das heißt, es muss nicht zusätzlich per pip install installiert werden. Es reicht aus, es in die Skriptdatei selbst zu importieren.

import re

Angenommen, wir müssen alle Header finden. In diesem Fall befinden sie sich im h1-Tag. Um sie per Code zu finden, können Sie Folgendes anwenden:

re.findall(r'<h1>(.+?)</h1>', data)

Skriptergebnis:

('Example Domain')

Vollständiger Skriptcode:

import urllib3
import re
http = urllib3.PoolManager()
resp = http.request('GET', 'https://example.com')
data = resp.data.decode('utf-8')
print(re.findall(r'<h1>(.+?)</h1>', data))

Um Daten von anderen Tags oder beispielsweise den Inhalt von Tags zu erhalten, können auch reguläre Ausdrücke verwendet werden.

Anfragen

Die zweitbeliebteste Bibliothek ist Requests. Diese Bibliothek wird wie die vorherige auch zum Ausführen von Abfragen verwendet. Es ist jedoch einfacher und benutzerfreundlicher. Darüber hinaus ist es vorinstalliert und erfordert keine Installation.

Vorteile

Die Requests-Bibliothek ist wie UrlLib3 für die Durchführung verschiedener Abfragen konzipiert und bietet außerdem eine Reihe von Vorteilen:

  1. Es basiert auf urllib3 und httplib und verfügt daher über alle deren Funktionen.
  2. Deutlich einfacher zu verwenden als UrlLib3.
  3. Unterstützt HEAD-, POST-, PUT-, PATCH- und DELETE-Anfragen.
  4. Fügt Adressen automatisch Abfragezeichenfolgen hinzu und kodiert POST-Daten.

Zusätzlich zu den oben genannten Pluspunkten ist die Bibliothek auch benutzerfreundlich, verfügt über eine sehr große Community und ist mit anschaulichen Beispielen gut dokumentiert.

Nachteile

Leider hat diese Bibliothek auch Nachteile:

  1. Es kann keine Datenverarbeitung durchgeführt werden, daher ist es nicht sehr praktisch, es als eigenständige Lösung zum Scrapen zu verwenden.
  2. Es ist eine synchrone Bibliothek. Das heißt, das gesamte Programm wird vor der Abfrage und Antwort blockiert.

Das Problem der Synchronität sowie der fehlenden Datenverarbeitung lässt sich jedoch durch die Anbindung zusätzlicher Bibliotheken lösen.

Verwendung

Die Requests-Bibliothek soll Python-Abfragen vereinfachen. Daher eignet es sich gut zum Scrapen, wenn Sie den Code der gesamten Seite erhalten möchten.

Installieren der Anforderungsbibliothek

Falls es gelöscht wurde, verwenden Sie zum erneuten Installieren den folgenden Befehl:

pip install requests

Jetzt ist die Bibliothek einsatzbereit.

Verwenden der Requests-Bibliothek

Diese HTTP-Bibliothek unterstützt wie die vorherige zwei Arten von Abfragen: Get und Post. Get-Anfragen werden verwendet, um Daten von der Site abzurufen, und Post-Anfragen werden zum Senden von Daten verwendet. Schauen wir uns unser Tutorial an.

Erstellen Sie dazu eine Datei mit der Erweiterung *.py und importieren Sie die Anforderungsbibliothek:

import requests

Lassen Sie uns zunächst die Daten mithilfe der Get-Methode abrufen. Dafür reicht im Gegensatz zur vorherigen Bibliothek eine Zeile aus:

print(requests.get('https://example.com').text)

Execution result:

D:\scripts>requests_test.py
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    <style>
…
    </style>
</head>
<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

Wenn Sie diese Bibliothek verwenden, können Sie sie verwenden, ohne das Ergebnis zu dekodieren oder zu kodieren – es wird in einer praktischen Form gespeichert. Skriptcode:

import requests
print(requests.get('https://example.com').text)

Leider können Sie in dieser Bibliothek nur bestimmte Daten empfangen oder senden, sodass Sie diese anschließend selbst verarbeiten müssen. Allerdings sind reguläre Ausdrücke, wie bereits erwähnt, ein universelles Werkzeug, sodass wir wieder auf die Bibliothek regulärer Ausdrücke zurückgreifen werden.

Datenverarbeitung mit regulären Ausdrücken

Wir haben bereits zuvor Header-Daten auf der Seite erhalten, also holen wir uns dieses Mal den Link, der im -Tag gespeichert ist:

re.findall(r'<a\shref=\S(.+?)\S>', data)

Hier haben wir spezielle reguläre Ausdrucksmuster verwendet, nämlich „\S“ und „\s“. Sie werden benötigt, um ein bestimmtes Zeichen zu kodieren. In diesem Fall ersetzt \S ein Zeichen (Anführungszeichen) und \s ein Leerzeichen.

Als Ergebnis der Skriptausführung erhielten wir einen Link, der im Tag gespeichert wurde:

D:\scripts>requests_test.py

('https://www.iana.org/domains/example')

Skriptcode:

import requests
import re
data = requests.get('https://example.com').text
print(re.findall(r'<a\shref=\S(.+?)\S>', data))

Wie Sie dem Code entnehmen können, ist die Anforderungsbibliothek sehr praktisch und funktional. Die Verwendung regulärer Ausdrücke ist jedoch nicht immer komfortabel und die Anbindung zusätzlicher Bibliotheken zur Verwendung von CSS-Selektoren kann recht schwierig und ressourcenintensiv sein.

Lesen Sie auch HSo verwenden Sie cURL in Python

In diesem Fall können Sie die Requests-Bibliothek und spezielle Tools zum Scraping verwenden, die die Funktionen übernehmen, die normalerweise spezielle Bibliotheken ausführen. Nehmen wir als Beispiel unsere Web-Scraping-API.

Um es nutzen zu können, müssen Sie sich registrieren und den API-Schlüssel Ihres Kontos kopieren. Du wirst es etwas später brauchen. Um mit der Ressource arbeiten zu können, benötigen wir die POST-Methode:

import requests
import json
 
url = "https://api.scrape-it.cloud//scrape"
payload = json.dumps({
    "extract_rules": {
        "title": "h1"
    },
    "url": "example.com"
})
headers = {
  'x-api-key': 'YOUR-API-KEY',
  'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

Es reicht aus, Ihre Regeln in extract_rules zu konfigurieren, die erforderliche URL anzugeben und Ihren API-Schlüssel einzugeben, damit es funktioniert.

Scrape-It.Cloud

Scrape-It.Cloud SDK ist eine Bibliothek, die eine Reihe vorgefertigter Funktionen und Methoden bereitstellt, die einfach in Ihren Python-Code integriert werden können, sodass Sie auf unsere Web-Scraping-API zugreifen und mit ihr interagieren können. Es ist eine optimale Lösung, um sich vor Blockaden zu schützen, Captchas zu lösen und Probleme beim Abrufen von JavaScript-Daten zu lösen.

Vorteile

Da diese Bibliothek mit der Web-Scraping-API arbeitet, bietet sie mehrere Vorteile:

  1. Es verfügt über eine einfache Syntax, die auch Anfänger verwenden können.
  2. Es ermöglicht die Verwendung von Proxys (Wohn- und Rechenzentrumsserver).
  3. Es entfernt dynamische Websites, die JavaScript verwenden.
  4. Es analysiert Daten aus jeder Struktur gut.

Die Bibliothek verfügt über viele zusätzliche Einstellungen und Funktionen, die in der offiziellen Dokumentation ausführlich beschrieben werden.

Nachteile

Es hat einen Nachteil:

  1. Die gescrapten Daten liegen im JSON-Format vor, daher ist eine zusätzliche Verarbeitung erforderlich, um damit zu arbeiten.

Dieser Nachteil lässt sich leicht beheben, indem die zusätzliche integrierte JSON-Bibliothek angeschlossen wird.

Verwendung

Die Scrape-It.Cloud-Bibliothek ist zum Scrapen von Daten konzipiert. Es hilft beim Scrapen jeder Website, auch wenn Ihre IP blockiert ist. Es eignet sich sowohl zum Ausführen von Anfragen als auch zum Abrufen spezifischer Daten von einer Seite.

Installation der Scrape-It.Cloud-Bibliothek

Sie können die Bibliothek über pip install installieren:

pip install scrapeit-cloud

Wir empfehlen außerdem die Installation der Bibliotheken für das Scraping von Google Maps und Google SERP, die wir ebenfalls berücksichtigen werden:

pip install google-serp-api
pip install sc-google-maps-api

Um diese Bibliotheken nutzen zu können, benötigen wir einen API-Schlüssel, den Sie nach der Anmeldung bei scrape-it.cloud in Ihrem persönlichen Konto finden. Danach können Sie mit der Erstellung eines Schabers beginnen.

Verwendung der Scrape-It.Cloud-Bibliothek

Erstellen Sie eine Datei mit der Erweiterung *.py und schließen Sie die Bibliotheken ein:

from scrapeit_cloud import ScrapeitCloudClient
import json

Geben Sie nun Ihren API-Schlüssel ein:

client = ScrapeitCloudClient(api_key='YOUR_API_KEY')
Let’s get the code of the page and display the result:
response = client.scrape(
    params={
        "url": "https://quotes.toscrape.com/"
    }
)
print(response.text)

Überprüfen Sie das Ergebnis:

D:\scripts>scrape_test.py

{"status":"ok","scrapingResult":{"content":"<!DOCTYPE html><html lang=\"en\"><head>\n\t<meta charset=\"UTF-8\">\n\t<title>Quotes to Scrape</title>\n    <link rel=\"stylesheet\" href=\"/static/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"/static/main.css\">\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"row header-box\">\n            <div class=\"col-md-8\">\n                <h1>\n                    <a href=\"/\" style=\"text-decoration: none\">Quotes to Scrape</a>\n                </h1>\n            </div>\n            <div class=\"col-md-4\">\n                <p>\n                \n                    <a href=\"/login\">Login</a>\n                \n                </p>\n   …   </>}}

Wie bereits erwähnt, gibt die Bibliothek JSON-Code zurück und wenn Sie auf die Struktur achten, befindet sie sich in diesem Fall im Parameter „content“. Importieren wir die JSON-Bibliothek und drucken nur den Inhalt dieses Parameters:

data = json.loads(response.text)
result = data("scrapingResult")("content")
print(result)

Das Ergebnis:

D:\scripts>scrape_test.py
<!DOCTYPE html><html lang="en"><head>
        <meta charset="UTF-8">
        <title>Quotes to Scrape</title>
    <link rel="stylesheet" href="https://scrape-it.cloud/static/bootstrap.min.css">
    <link rel="stylesheet" href="http://scrape-it.cloud/static/main.css">
</head>
<body>
    <div class="container">
        <div class="row header-box">
            ...
</html>

Skriptcode:

from scrapeit_cloud import ScrapeitCloudClient
import json
client = ScrapeitCloudClient(api_key='YOUR-API-KEY')
response = client.scrape(
    params={
        "url": "https://quotes.toscrape.com/"
    }
)
data = json.loads(response.text)
result = data("scrapingResult")("content")
print(result)

Jetzt sind die Daten genau so, wie wir sie wollten.

Datenverarbeitung mit der Scrape-It.Cloud-Bibliothek

Es gibt zusätzliche Bibliotheken zum Scrapen von Ressourcen wie Google Maps oder Google SERPs. Schauen wir uns Beispiele für deren Verwendung an.

Die Grundelemente der Arbeit mit Bibliotheken sind dieselben und unterscheiden sich nicht von der Scrape-It.Cloud-Bibliothek. Ihr einziger Unterschied besteht darin, dass sie zusätzliche Parameter haben.

Zum Scrapen von Google-Suchergebnissen können Sie beispielsweise Folgendes verwenden:

from google_serp_api import ScrapeitCloudClient
import json
client = ScrapeitCloudClient(api_key='YOUR_API_KEY') 
response = client.scrape(
    params={
        "keyword": "pizza",
        "country": "US",
        "num_results": 10,
        "domain": "com"
    }
)
data = json.loads(response.text)
print (data)

So erhalten Sie Daten von Google Maps:

from sc_google_maps_api import ScrapeitCloudClient
import json
client = ScrapeitCloudClient(api_key='YOUR_API_KEY')
response = client.scrape(
    params={
        "keyword": "plumber in new york",
        "country": "US",
        "domain": "com"
    }
)
data = json.loads(response.text)
print (data)

Ergebnis:

D:\scripts>scrape_test.py

{'status': 'ok', 'scrapingResult': {'pagination': {'start': 0}, 'locals': ({'position': 1, 'title': 'RR Plumbing Roto-Rooter', 'phone': '+1 212-687-1215', 'address': '450 7th Ave Ste B, New York, NY 10123, United States', 'website': 'https://www.rotorooter.com/manhattan/', 'workingHours': {'timezone': 'America/New_York', 'days': ({'day': 'Wednesday', 'time': 'Open 24 hours'}

Die Verwendung dieser Bibliotheken wird selbst für Anfänger einfach genug sein.

LXML

Lxml ist eine Bibliothek zum Parsen und Verarbeiten von HTML- und XML-Strukturen. Es ist schnell und funktionsfähig genug, kann aber selbst keine GET-Anfragen stellen, daher benötigen Sie eine zusätzliche Bibliothek, z. B. Requests, um Abfragen durchzuführen.

Vorteile

Zu den Vorteilen von Lxml gehören die folgenden:

  1. Betriebsgeschwindigkeit.
  2. Für eine gute Arbeit mit lxml spielt es keine Rolle, wie gut die Struktur einer Site ist.
  3. Unterstützung für XSLT-Transformationen.
  4. Funktioniert mit CSS-Selektoren genauso gut wie mit XPath.

Infolgedessen erstellt die lxml-Bibliothek sehr praktische Datenbäume.

Nachteile

Allerdings gibt es auch Nachteile:

  1. Es ist eine komplizierte Bibliothek und für Anfänger nicht gut geeignet.
  2. Hoher Speicherverbrauch.
  3. Es mangelt an zahlreichen Beispielen und einer aktiven Community.

Aus diesem Grund wird die Bibliothek normalerweise für bestimmte Aufgaben verwendet.

Verwendung

Wie oben erwähnt, wird lxml nicht immer verwendet. Aufgrund ihrer Mängel wird diese Bibliothek nur dann verwendet, wenn es notwendig ist, den Baum einer Site mit einer fehlerhaften Struktur oder XML-Dokumente zu analysieren. Dies liegt daran, dass sie in diesem Fall die Aufgabe besser bewältigen kann als andere Bibliotheken.

Installieren der Lxml-Bibliothek

Die Installation erfolgt über pip install:

pip install lxml

Nachdem Sie den Befehl ausgeführt haben, können Sie mit der Arbeit mit der installierten Bibliothek beginnen.

Verwendung der Lxml-Bibliothek

Um zu verstehen, wie diese Bibliothek funktioniert, müssen wir Daten von der Site abrufen und verarbeiten. Um die Anfrage auszuführen, verwenden wir die Requests-Bibliothek:

import requests
data = requests.get('https://quotes.toscrape.com')

Um mit HTML-Seiten zu arbeiten, importieren wir ein spezielles Modul der XML-Bibliothek:

from lxml import html

Geben Sie die Struktur der Site in eine Variable ein:

tree = html.fromstring(data.content)

Wir können dies jetzt anzeigen, erhalten dann aber den gesamten Code der Seite. Kommen wir also zur weiteren Bearbeitung.

Datenverarbeitung mit Lxml

Wir können XPath- oder CSS-Selektoren verwenden, um bestimmte Daten auszuwählen. Da wir für die Arbeit mit CSS-Selektoren das zusätzliche lxml-Modul cssselect importieren müssen, wählen wir Anführungszeichen mit xpath aus und zeigen das Ergebnis an:

quotes = tree.xpath('//div(@class="quote")/span(@class="text")/text()')
print(quotes)

Das Ergebnis:

D:\scripts>lxml_test.py

('“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”', '“It is our choices, Harry, that show what we truly are, far more than our abilities.”', '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”', '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”', "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”", '“Try not to become a man of success. Rather become a man of value.”', '“It is better to be hated for what you are than to be loved for what you are not.”', "“I have not failed. I've just found 10,000 ways that won't work.”", "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”", '“A day without sunshine is like, you know, night.”')

Um Element für Element aus einer neuen Zeile auszugeben, ändern wir die Ausgabemethode:

for quote in quotes:
    print(quote)

Die Ausgabe erfolgt nun in einer neuen Zeile. Sämtlicher Skriptcode:

import requests
from lxml import html
data = requests.get('https://quotes.toscrape.com')
tree = html.fromstring(data.content)
quotes = tree.xpath('//div(@class="quote")/span(@class="text")/text()')
for quote in quotes:
    print(quote)

Daraus können wir schließen, dass lxml seine Funktionen recht gut beherrscht.

Schöne Suppe4

BeautifulSoup4, oder einfach BS4, ist eine Bibliothek, die für das Parsen von Ressourcen erstellt wurde. Während wir die beiden vorherigen Bibliotheken verwenden könnten, um Daten mithilfe von Abfragen abzurufen, wird BS4 zum Verarbeiten der resultierenden Daten verwendet. Zur Verarbeitung eignen sich sowohl HTML- als auch XML-Strukturen.

Diese Bibliothek kann nicht alleine verwendet werden. Es benötigt eine zusätzliche Bibliothek zum Ausführen von Abfragen. In diesem Artikel verwenden wir die Requests-Bibliothek, Sie können jedoch auch jede andere verwenden.

Vorteile

BS4 ist eine wunderbare Bibliothek, mit der Sie Webseiten schnell und einfach verarbeiten und Daten abrufen können. Es hat mehrere Vorteile:

  1. Es kann sowohl mit HTML- als auch mit XML-Strukturen arbeiten.
  2. Anfängerfreundlich. Es ist leicht zu erlernen und aufgrund der einfachen Syntax auch für Anfänger geeignet.
  3. Es gibt eine Reihe von Suchmöglichkeiten: nach Name, nach ID, nach Attributen (z. B. Klassen) und nach Text.
  4. Es ist nicht ressourcenintensiv.
  5. Verfügt über gut dokumentierte Funktionen.

Und beautifulsoup kann sowohl kleine als auch große Seiten verarbeiten.

Nachteile

Im Zusammenhang mit der Funktionalität und Aufgabenstellung der Bibliothek lassen sich auch eine Reihe von Nachteilen hervorheben:

  1. Es funktioniert nur mit statischen Seiten. Leider unterstützt BS4 die Arbeit von Headless-Browsern nicht und kann daher nicht mit dynamischen Websites funktionieren.
  2. Diese Bibliothek ist grundsätzlich nicht für Abfragen konzipiert und kann daher nicht für eigenständiges Scraping verwendet werden.
  3. Bei einer unübersichtlichen Seitenstruktur kann dies sehr ungenau funktionieren.

Verwendung

Die schöne Suppenbibliothek dient zur Verarbeitung des XML- oder HTML-Codes, den Sie bereits erhalten haben. Es leistet hervorragende Arbeit beim Empfangen, Durchsuchen und Verarbeiten von Daten.

Damit es jedoch ordnungsgemäß funktioniert, muss es mit einer Abfragebibliothek verwendet werden: UrlLib, Requests oder http.client.

Installieren der BeautifulSoup4-Bibliothek

Die Bibliothek ist nicht vorinstalliert, daher kann sie mit pip install installiert werden:

pip install beautifulsoup4

Nach der Installation erscheint eine Meldung über den erfolgreichen Vorgang:

D:\scripts>pip install beautifulsoup4
Collecting beautifulsoup4
  Downloading beautifulsoup4-4.12.0-py3-none-any.whl (132 kB)
     ---------------------------------------- 132.2/132.2 kB 865.1 kB/s eta 0:00:00
Requirement already satisfied: soupsieve>1.2 in c:\users\user\appdata\local\programs\python\python310\lib\site-packages (from beautifulsoup4) (2.3.2.post1)
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.12.0

Wenn alles gut geht, fahren wir mit dem nächsten Teil fort – der praktischen Anwendung der Bibliothek.

Verwendung der BeautifulSoup4-Bibliothek

Lassen Sie uns zunächst eine Datei mit der Erweiterung *.py erstellen, die erforderlichen Bibliotheken verbinden und den Code der Seite abrufen. Das haben wir schon einmal gemacht, deshalb gehen wir nicht näher darauf ein:

import requests
from bs4 import BeautifulSoup
data = requests.get('https://example.com')

Jetzt müssen wir diesen Code mit der BS4-Bibliothek verarbeiten:

soup = BeautifulSoup(data.text, "html.parser")

Um sicherzustellen, dass alles in Ordnung ist, zeigen wir das Ergebnis an:

D:\scripts>bs4_test.py
<!DOCTYPE html>
<html>
<head>
<title>Example Domain</title>
<style type="text/css">
    …
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

Oberflächlich betrachtet unterscheidet sich das Ergebnis nicht von der Ausführung einer Abfrage und der Anzeige des Inhalts auf dem Bildschirm, aber das stimmt nicht. Durch die Verarbeitung des Codes mit der BS4-Bibliothek können wir die Daten schnell abrufen, ohne reguläre Ausdrücke zu verwenden.

Datenverarbeitung mit BS4

Am einfachsten ist es, Daten anhand von Tags zu suchen. Lassen Sie uns die Überschriften sowie den Inhalt des -Tags finden. Das heißt, wir werden dasselbe tun wie mit regulären Ausdrücken, nur unter Verwendung der BS4-Bibliothek:

titles = soup.find('h1').text
href = soup.find('a').get("href")

Wenn es mehrere Header oder Links gäbe, könnten wir Suppe.find_all anstelle von Suppe.find verwenden. Darüber hinaus bietet BS4 optional die Möglichkeit, nach Klassen zu suchen. Für dieses Beispiel reicht uns eine einfache Testseite nicht aus, also nutzen wir https://quotes.toscrape.com als Beispiel.

Zitate werden im -Tag gespeichert und haben die Klasse „text“. Lassen Sie uns diese Parameter in unserem Code festlegen:

 soup.find_all('span', class_='text')

Dieser Code gibt jedoch alle Anführungszeichen zusammen mit Tags aus:

D:\scripts>bs4_test.py

(<span class="text" itemprop="text">“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”</span>, <span class="text" itemprop="text">“It is our choices, Harry, that show what we truly are, far more than our abilities.”</span>, <span class="text" itemprop="text">“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”</span>, <span class="text" itemprop="text">“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”</span>, <span class="text" itemprop="text">“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”</span>, <span class="text" itemprop="text">“Try not to become a man of success. Rather become a man of value.”</span>, <span class="text" itemprop="text">“It is better to be hated for what you are than to be loved for what you are not.”</span>, <span class="text" itemprop="text">“I have not failed. I've just found 10,000 ways that won't work.”</span>, <span class="text" itemprop="text">“A woman is like a tea bag; you never know how strong it is until it's in hot water.”</span>, <span class="text" itemprop="text">“A day without sunshine is like, you know, night.”</span>)   

Um dieses Problem zu lösen, gehen wir alle Daten Zeile für Zeile durch und wählen nur den Inhalt aus:

for result in text:
    print(result.text)

Das Ergebnis des Skripts:

D:\scripts>bs4_test.py
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
“It is our choices, Harry, that show what we truly are, far more than our abilities.”
“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
“Try not to become a man of success. Rather become a man of value.”
“It is better to be hated for what you are than to be loved for what you are not.”
“I have not failed. I've just found 10,000 ways that won't work.”
“A woman is like a tea bag; you never know how strong it is until it's in hot water.”
“A day without sunshine is like, you know, night.”

Skriptcode:

import requests
from bs4 import BeautifulSoup

data = requests.get()
soup = BeautifulSoup(data.text, "html.parser")
text = soup.find_all('span', class_='text')
for result in text:
    print(result.text)

Diese Flexibilität und Vielseitigkeit haben die BS4-Bibliothek so beliebt gemacht.

Selen

Selenium ist eine bekannte Python 3-Bibliothek, die sowohl zum Testen als auch zum Scrapen verwendet wird. Es eignet sich gut für die Simulation des Verhaltens eines echten Benutzers, was hilft, Blockierungen zu vermeiden.

Bei der Verwendung von Selenium wird ein Webtreiber gestartet, der das Verhalten eines Browsers simuliert.

Vorteile

Selenium ist eine ausgewogene Bibliothek, die sowohl für Anfänger als auch für Profis geeignet ist. Es hat folgende Vorteile:

  1. Es unterstützt die Arbeit mit Headless-Browsern und kann dynamische Daten extrahieren.
  2. Unterstützt verschiedene Möglichkeiten zur Suche nach Daten, sei es anhand von Attributen oder mithilfe von XPath.
  3. Unterstützt die Möglichkeit, mit Elementen auf der Seite zu interagieren (z. B. Schaltflächen oder Eingabefelder in Webanwendungen).
  4. Es stellt analoge Bibliotheken für alle gängigen Programmiersprachen bereit.

Abgesehen von allem, was oben erwähnt wurde, ist die Bibliothek recht einfach und angenehm zu bedienen. Deshalb bereitet die Bekanntschaft damit keine großen Schwierigkeiten.

Nachteile

Tatsächlich gibt es nicht so viele Nachteile:

  1. Da der Webtreiber zum Ausführen des Skripts aufgerufen wird, ist dies ziemlich ressourcenintensiv.
  2. Scraping und andere Aktionen werden erst ausgeführt, nachdem die Seite vollständig geladen ist, und das kann ziemlich lange dauern.

Ansonsten weist die Bibliothek keine derart eklatanten Nachteile auf.

Verwendung

Selenium wird für automatisierte Tests verwendet und eignet sich hervorragend zum Scrapen von Websites, die JavaScript verwenden. Mit einem Headless-Browser können Sie erfolgreich Daten von dynamischen Websites sammeln.

Es eignet sich auch hervorragend für Fälle, in denen Sie vor dem Scrapen einige Aktionen ausführen müssen, z. B. das Klicken auf eine Schaltfläche oder das Anmelden.

Selen installieren

Wie andere Bibliotheken kann Selenium mit pip install installiert werden:

pip install selenium

Danach kann es in den Code importiert und wie jede andere Bibliothek verwendet werden.

Selenium benötigt einen Webtreiber für die Arbeit. Es sollte die gleiche Version wie der Chrome-Browser sein. Entpacken Sie den Webdriver auf das Laufwerk C. Wir werden es später brauchen.

Verwendung von Selen

Bevor Sie mit der Verwendung von Selenium beginnen, sollten Sie verstehen, in welcher Form manche Webseiten gespeichert werden und wie Entwickler dem Scraping widerstehen.

Die wichtigste Methode, das Scraping zu stoppen, besteht darin, Javascript-Code hinzuzufügen, der nach dem Laden der Seite ausgeführt wird und Daten dynamisch abruft. In diesem Fall würden die zuvor betrachteten Bibliotheken eine leere Anfrage oder eine Anfrage zurückgeben, die Javascript-Code, aber nicht den Seiteninhalt enthält.

Im Fall von Selenium gibt die Anfrage den Inhalt zurück, da WebDriver wartet, bis die Seite vollständig geladen ist, und erst dann die erforderlichen Aktionen ausführt.

Erstellen Sie eine Datei mit der Erweiterung *.py und hängen Sie Selenium WebDriver an:

from selenium import webdriver

Damit es funktioniert, geben wir den Pfad an, in den wir den WebDriver entpackt haben:

DRIVER_PATH = 'C:\chromedriver.exe'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)

Lassen Sie uns nun die Daten von der Seite abrufen:

driver.get("https://quotes.toscrape.com/")

Sobald die Seite empfangen wurde, können Sie damit arbeiten und die notwendigen Informationen filtern. Damit das Skript seine Arbeit ordnungsgemäß beendet, müssen Sie WebDriver am Ende schließen:

driver.close()

Skriptcode:

from selenium import webdriver

DRIVER_PATH = 'C:\chromedriver.exe'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
text = driver.get("https://quotes.toscrape.com/")
driver.close()

 

Datenverarbeitung mit Selen

Lassen Sie uns die Anführungszeichen noch einmal extrahieren. Dazu benötigen wir das By-Modul der Selenium-Bibliothek. Importieren wir es:

from selenium.webdriver.common.by import By

Jetzt können wir die angeschlossene Bibliothek nutzen, um die benötigten Daten zu verarbeiten und zu suchen. Der einfachste Weg, Anführungszeichen auszuwählen, ist die Verwendung von CSS-Selektoren.

Neben CSS-Selektoren unterstützt Selenium auch die folgenden Methoden:

  1. AUSWEIS. Suche nach Element-ID.
  2. NAME. Suche nach Elementnamen.
  3. XPATH. Suche nach XPath.
  4. LINK TEXT. Suche nach Linktext.
  5. PARTIAL_LINK_TEXT. Suche nach teilweisem Linktext.
  6. VERLINKE DEN NAMEN. Suche nach Tag-Namen.
  7. KLASSENNAME. Suche nach Klassennamen.
  8. CSS_SELECTOR. Suche nach CSS-Selektor.

Finden Sie Zitate mit dem CSS-Selektor span.text und speichern Sie sie in der Textvariablen:

text = driver.find_element(By.CSS_SELECTOR, "span.text")

Zeigen Sie die Variable an und stellen Sie sicher, dass alles ordnungsgemäß funktioniert:

D:\scripts>selenium_test.py
D:\scripts\selenium_test.py:5: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(executable_path=DRIVER_PATH)
 DevTools listening on ws://127.0.0.1:52684/devtools/browser/fe204bdd-2d10-47ca-999e-ddf22d5c3854
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
“It is our choices, Harry, that show what we truly are, far more than our abilities.”
“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
“Try not to become a man of success. Rather become a man of value.”
“It is better to be hated for what you are than to be loved for what you are not.”
“I have not failed. I've just found 10,000 ways that won't work.”
“A woman is like a tea bag; you never know how strong it is until it's in hot water.”
“A day without sunshine is like, you know, night.”

Skriptcode:

from selenium import webdriver
from selenium.webdriver.common.by import By

DRIVER_PATH = 'C:\chromedriver.exe'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get("https://quotes.toscrape.com/")
text = driver.find_elements(By.CSS_SELECTOR, "span.text")
for res in text:
    print(res.text)
driver.close()

Somit ist Selenium eine funktionsreiche Bibliothek, die das Risiko einer Blockierung beim Scraping verringert. Es ist auch nützlich für Datenwissenschaftler oder das Schreiben von Bots.

Scrapy

Scrapy ist ein Open-Source-Web-Scraping-Framework, das sich ideal für große oder skalierbare Projekte eignet. Es verfügt über integrierte Funktionen zum Erstellen von Scrapern, passt die Scraping-Geschwindigkeit automatisch an und ermöglicht Ihnen das Speichern von Ausgabedaten in den Formaten JSON, CSV und XML mithilfe integrierter Tools. Darüber hinaus führt Scrapy Abfragen asynchron durch, sodass Sie sie schneller ausführen können.

Im Gegensatz zu den vorherigen Optionen ist es besser, Scraper mit Scrapy mithilfe der integrierten Funktionalität zu erstellen.

Vorteile

Dieses Framework bietet folgende Vorteile:

  1. Geeignet für jedes Projekt, auch für skalierbare.
  2. Kann innerhalb desselben Projekts separate Webcrawler erstellen, von denen jeder für seine eigenen Aufgaben verantwortlich ist.
  3. Unterstützt die Erstellung ganzer Projekte mit gemeinsamen und separaten Einstellungen, Upload-Regeln, Ausnahmen und Skripten.
  4. Es ist asynchron.

Leider ist dieses Web-Scraping-Framework für Anfänger ziemlich schwierig.

Nachteile

Zu den Nachteilen von Scrapy gehören:

  1. Hohe Arbeitskomplexität für Anfänger.
  2. Hoher Ressourcenverbrauch.
  3. Nicht zum Scrapen dynamischer Webseiten geeignet.

Aus diesem Grund wird Scrapy eher selten und normalerweise für Projekte verwendet, die skaliert werden müssen.

Verwendung

Scrapy ist ein spezielles Scraping-Framework für das Web-Crawling. Es eignet sich hervorragend für große und skalierbare Projekte, bei denen eine Unterteilung nach Scraping-Richtung erfolgt. Aufgrund seiner Fähigkeit, mehrere Webcrawler innerhalb eines einzigen Projekts zu erstellen, ist Scrapy beliebt, auch wenn es schwierig zu verwenden ist.

Scrapy installieren

Zur Installation verwenden Sie pip install:

pip install scrapy

Danach können Sie mit Scrapy arbeiten.

Scrapy verwenden

Um mit der Erstellung eines Scrapers fortzufahren, geben Sie in der Befehlszeile einen Befehl ein, um ein neues Projekt zu erstellen:

scrapy startproject scrapy_test

Wenn alles richtig gemacht wurde, erscheint Folgendes:

D:\scripts>scrapy startproject scrapy_test
New Scrapy project 'scrapy_test', using template directory 'C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\scrapy\templates\project', created in:
    D:\scripts\scrapy_test
 You can start your first spider with:
    cd scrapy_test
    scrapy genspider example example.com

Gehen Sie nun mit dem Befehl in das Projektverzeichnis:

cd scrapy_test

Die folgenden Dateien wurden automatisch im Verzeichnis erstellt:

  1. Items.py. Diese Datei beschreibt die Klassen.
  2. Pipelines.py. Beschreiben Sie die Aktionen, die ausgeführt werden, wenn Sie die Spinne öffnen oder schließen. Sie können auch festlegen, wie die Daten gespeichert werden.
  3. Settings.py. Diese Datei enthält die Benutzereinstellungen für den Spider.
  4. Spinnen. Der Ordner, in dem die Spider des ausgewählten Projekts gespeichert sind.

Dann erstellen wir in diesem Projekt die Basisspinne:

scrapy genspider quotes quotes.toscrape.com

Code der automatisch generierten Datei:

import scrapy

class QuotesSpider(scrapy.Spider):
    name="quotes"
    allowed_domains = ('quotes.toscrape.com')
    start_urls = ('http://quotes.toscrape.com/')
 
    def parse(self, response):
        pass

Datenverarbeitung mit Scrapy

Der def parse(self, Response)-Block beschreibt die Elemente, die gescrapt werden müssen. Scrapy unterstützt sowohl CSS-Selektoren als auch XPath. Machen wir es mit XPath:

item = DemoItem()
      item("text") = response.xpath("span(@class="text")/text()").extract()
      return items

Vollständiger Skriptcode:

import scrapy

class QuotesSpider(scrapy.Spider):
    name="quotes"
    allowed_domains = ('quotes.toscrape.com')
    start_urls = ('http://quotes.toscrape.com/')

    def parse(self, response):
      item = DemoItem()
      item("text") = response.xpath("span(@class="text")/text()").extract()
      return items

Pyppeteer

Die letzte Bibliothek auf der Liste ist die Python-Version der berühmten NodeJS-Bibliothek – Puppeteer. Wie Selenium ermöglicht uns Pyppeteer die Simulation des Benutzerverhaltens und die Arbeit mit JavaScript.

Vorteile

Diese Bibliothek bietet eine Reihe von Vorteilen:

  1. Es gibt ein Analogon in NodeJS, das sehr beliebt ist.
  2. Hat eine sehr aktive Community und eine gut geschriebene Dokumentation.
  3. Dank der Verwendung eines Headless-Browsers eignet es sich hervorragend zum Scrapen dynamischer Seiten.

Für diejenigen, die es gewohnt sind, es auf NodeJS zu verwenden, wird es sehr praktisch sein, damit zu arbeiten.

Nachteile

Leider sind auch die Nachteile vorhanden:

  1. Es handelt sich ursprünglich um eine NodeJS-Bibliothek und es gibt daher nicht sehr viele Beispiele in Python.
  2. Für Anfänger recht komplex.
  3. Ressourcenintensiv.

Trotz aller Nachteile verdient es jedoch Aufmerksamkeit.

Verwendung

Gut für große Projekte. Es lohnt sich auch, diese Bibliothek zu verwenden, wenn Sie dynamische Daten extrahieren müssen.

Dank seiner großartigen Funktionalität eignet es sich für die meisten Aufgaben, beispielsweise die Datenextraktion oder das Parsen von HTML-Dokumenten.

Pyppeteer installieren

Installieren Sie die Bibliothek über pip install:

pip install pyppeteer

Im Allgemeinen wird bei dieser Bibliothek auch die Asyncio-Bibliothek verwendet, daher wird empfohlen, diese ebenfalls zu installieren:

pip install asyncio

Verwendung von Pyppeteer

Erstellen Sie zunächst eine Datei mit der Erweiterung *.py und importieren Sie die erforderlichen Bibliotheken:

import asyncio
from pyppeteer import launch

Fügen wir eine asynchrone Funktion hinzu, um den Ländercode abzurufen und den Code anzuzeigen:

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://quotes.toscrape.com')
    html = await page.content()
    print(html)
    await browser.close()

Lassen Sie uns den Code ausführen und sehen, was das Ergebnis sein wird. Bei der ersten Verwendung kann Chromium geladen werden:

D:\scripts\pyppeteer_test.py:12: DeprecationWarning: There is no current event loop
  asyncio.get_event_loop().run_until_complete(main())
(INFO) Starting Chromium download.
  4%|██

Dadurch wird der Code ausgeführt, der den gesamten Code der Seite anzeigt:

D:\scripts>pyppeteer_test.py
D:\scripts\pyppeteer_test.py:12: DeprecationWarning: There is no current event loop
  asyncio.get_event_loop().run_until_complete(main())
(INFO) Starting Chromium download.
100%|████████████████████████████████████████████████████████████████████████████████| 137M/137M (06:26<00:00, 354kb/s)
(INFO) Beginning extraction
(INFO) Chromium extracted to: C:\Users\user\AppData\Local\pyppeteer\pyppeteer\local-chromium\588429
<!DOCTYPE html><html lang="en"><head>
        <meta charset="UTF-8">
        <title>Quotes to Scrape</title>
    <link rel="stylesheet" href="https://scrape-it.cloud/static/bootstrap.min.css">
    <link rel="stylesheet" href="http://scrape-it.cloud/static/main.css">
</head>
<body>
    <div class="container">
        <div class="row header-box">
            <div class="col-md-8">
                <h1>
                    <a href="https://scrape-it.cloud/">Quotes to Scrape</a>
                </h1>
…

Datenverarbeitung mit Pyppeteer

Sie können auch CSS-Selektoren verwenden, um bestimmte Daten auszuwählen. Wählen wir nur Zitate aus:

text = await page.querySelectorAll("span.text")
    for t in text:
        qout = await t.getProperty("textContent")
        print(await qout.jsonValue())

Ausführungsergebnis:

D:\scripts>pyppeteer_test.py
D:\scripts\pyppeteer_test.py:15: DeprecationWarning: There is no current event loop
  asyncio.get_event_loop().run_until_complete(main())
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
“It is our choices, Harry, that show what we truly are, far more than our abilities.”
“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
“Try not to become a man of success. Rather become a man of value.”
“It is better to be hated for what you are than to be loved for what you are not.”
“I have not failed. I've just found 10,000 ways that won't work.”
“A woman is like a tea bag; you never know how strong it is until it's in hot water.”
“A day without sunshine is like, you know, night.”

Vollständiger Skriptcode:

import asyncio
from pyppeteer import launch
async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://quotes.toscrape.com')
    html = await page.content()
    text = await page.querySelectorAll("span.text")
    for t in text:
        qout = await t.getProperty("textContent")
        print(await qout.jsonValue())
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

Daher ist Pyppeteer eine gute Option, wenn Sie das Verhalten echter Benutzer simulieren oder schnell große Datenmengen extrahieren müssen.

Fazit und Erkenntnisse

Lassen Sie uns eine Vergleichstabelle geben, um die Auswahl des richtigen Werkzeugs zu erleichtern:

Bibliothek Benutzerfreundlich Leistung JavaScript-Unterstützung
urllib Einfach zu verwenden Schnell für kleine Anfragen, aber langsamer für großflächiges Schaben NEIN
Anfragen Einfach zu verwenden Schnell für kleine Anfragen, aber langsamer für großflächiges Schaben NEIN
lxml Einfach zu verwenden Sehr schnell zum Parsen und Bearbeiten von XML und HTML NEIN
Scrape-It.Cloud Einfach zu verwenden Sehr schnell zum Scrapen von Webressourcen Ja
Schöne Suppe4 Einfach zu verwenden Langsamer als einige andere Bibliotheken für groß angelegtes Scraping, aber für die meisten Anwendungsfälle immer noch schnell NEIN
Selen Kann für Anfänger komplex sein Relativ langsamer aufgrund des Mehraufwands bei der Nutzung des Webtreibers, bietet aber eine vollständige Browseremulation Ja
Scrapy Kann für Anfänger komplex sein Sehr schnell und skalierbar für große Scraping-Projekte NEIN
Pyppeteer Kann für Anfänger komplex sein, erfordert einige Kenntnisse in JavaScript und Browser-Automatisierung Aufgrund des Overheads der Browsernutzung relativ langsamer, bietet aber eine vollständige Browseremulation Ja

Wenn Sie Anfänger sind, schauen Sie sich spezielle Bibliotheken zum Scrapen genauer an, um Blockierungen zu vermeiden. Dies wird Ihnen helfen, besser zu verstehen, wie man Scraper schreibt.

Wenn Sie lernen möchten, wie man Scraper selbst schreibt, ist Python ideal – es ist recht einfach zu erlernen und verfügt über eine große Auswahl an Werkzeugen.

Scraping in Python ist eine relativ einfache Aufgabe, unabhängig von Ihrer Wahl: Sie verwenden einen Konstruktor oder schreiben Ihren eigenen Code mit einer der beliebten Scraping-Bibliotheken.

FAQ

Ist Python gut für Web Scraping geeignet?

Python eignet sich gut für Web Scraping und Datenverarbeitung im Allgemeinen. Es verfügt über viele Funktionen und Bibliotheken, die auf die Erfassung und Verarbeitung großer Datenmengen abzielen, und eignet sich sehr gut zum Schreiben kleiner, funktionaler Skripte.

Ist Scrapy besser als BeautifulSoup?

Scrapy und BeautifulSoup sind beide für unterschiedliche Aufgaben nützlich. Scrapy eignet sich eher für skalierbare oder große Projekte, während BeautifulSoup eher für Projekte geeignet ist, bei denen Daten nicht von einer Website abgerufen werden müssen, sondern anhand bereits erfasster Daten gesucht und verarbeitet werden müssen.

Was ist die beste Python-Bibliothek/das beste Python-Framework für Web Scraping?

Eine der besten Bibliotheken für Funktionalität ist Selenium. Es eignet sich für praktisch jede Aufgabe, einschließlich des Scrapings dynamischer Daten. Wenn Daten nur verarbeitet und nicht abgerufen werden müssen, wäre BS4 oder Lxml die beste Wahl.

Ist Selen besser als BeautifulSoup?

Selenium verfügt über einen breiteren Funktionsumfang als BeautifulSoup. Im Gegensatz zu BeautifulSoup ermöglicht es das Scrapen von Websites mit JavaScript, die Verwendung von Headless-Browsern und das Senden von Anfragen. Allerdings ist BeautifulSoup einfacher und eher für Anfänger geeignet.

Related Posts

Hinterlasse einen Kommentar