Heim BlogWeb-Scraping Web Scraping mit Scrapy Python

Web Scraping mit Scrapy Python

von Kadek

Scrapy ist das beliebteste Web-Scraping-Framework in Python. Zuvor gab es eine Überprüfung ähnlicher Tools. Im Gegensatz zu BeautifulSoup oder Selenium ist Scrapy keine Bibliothek. Der große Vorteil ist, dass das Tool völlig kostenlos ist.

Trotzdem ist es multifunktional und kann die meisten beim Scraping von Daten erforderlichen Aufgaben lösen, zum Beispiel:

  1. Unterstützt Multithreading.
  2. Kann verwendet werden, um von Link zu Link zu wechseln.
  3. Geeignet zur Datenextraktion.
  4. Ermöglicht die Durchführung einer Datenvalidierung.
  5. Speichert in den meisten bekannten Formaten/Datenbanken.

Scrapy verwendet Spiders, eigenständige Crawler mit einem bestimmten Satz an Anweisungen. So lässt es sich problemlos für Projekte jeder Größe skalieren, während der Code gut strukturiert bleibt. Dies ermöglicht es auch neuen Entwicklern, die laufenden Prozesse zu verstehen. Gekratzte Daten können im CSV-Format zur weiteren Verarbeitung durch Datenwissenschaftler gespeichert werden.

So installieren Sie Scrapy in Python

Bevor Sie sich mit der praktischen Anwendung von Scrapy befassen, sollten Sie es installieren. Dies geschieht über die Befehlszeile:

pip install scrapy

Um sicherzustellen, dass alles gut gelaufen ist, kann man Scrapy mit dem Befehl in den Interpreter importieren:

>>> import scrapy

Und wenn es keine Fehlermeldungen gibt, dann ist alles gut gelaufen.


Scrapy importieren
Verwenden Sie Import Scrapy

So verwenden Sie XPath mit Scrapy

Scrapy funktioniert gleichermaßen gut mit XPath- und CSS-Selektoren. Allerdings hat XPath eine Reihe von Vorteilen, weshalb es häufiger verwendet wird. Um das Beispiel zu vereinfachen, wird der gesamte XPath-Code auf der Befehlszeile ausgeführt. Gehen Sie dazu zu einer speziellen Python-Shell:

scrapy shell

Wählen Sie dann die Site aus, für die das Webcrawlen durchgeführt werden soll, und verwenden Sie den folgenden Befehl:

fetch("http://example.com/")

example.com
Scrape example.com

Das Ausführungsergebnis wird wie folgt sein:

2022-07-20 14:50:33 (scrapy.core.engine) DEBUG: Crawled (200) <GET http://example.com/> (referer: None)

Dies ist normal, da nicht angegeben wurde, welche Daten gecrawlt werden müssen. Um alle im Tag < html >… gespeicherten Daten auszuwählen, verwenden Sie einfach den folgenden Befehl:

response.xpath("/html").extract()

Ausführungsergebnis:

('<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 }\na: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>')

Die Verwendung von XPath ist Standard und sollte nicht zu weit gehen, aber als Beispiel versuchen wir, nur den Inhalt des

-Tags zurückzugeben:

>>> response.xpath("//h1").extract()
('<h1>Example Domain</h1>')

Oder erhalten Sie nur den Text:

>>> response.xpath("//h1/text()").extract()
('Example Domain')

Somit ist die Verwendung von XPath ein flexibles und einfaches Werkzeug zur Elementsuche.

Scrapy- und CSS-Selektoren

Selektoren sind im Gegensatz zu XPath weniger flexibel und ermöglichen beispielsweise nicht die Arbeit mit übergeordneten Elementen. Und obwohl es äußerst selten genutzt wird, kann das Fehlen einer solchen Möglichkeit frustrierend sein.

Im Allgemeinen erfolgt die Anforderung für CSS-Selektoren auf die gleiche Weise:

>>>response.css("h1").extract()
('<h1>Example Domain</h1>')

Die Wahl zwischen der Verwendung von XPath- und CSS-Selektoren liegt bei jedem, da der Unterschied zwischen der Verwendung dieser Selektoren hauptsächlich eine Frage der Bequemlichkeit für jeden einzelnen Benutzer ist.

Webseiten-Scraping mit Scrapy

Beginnen wir nun mit dem Bau eines einfachen Scrapers mit Scrapy. Um den ersten Scraper zu erstellen, nutzen Sie die integrierten Funktionen des Frameworks. Verwenden wir den folgenden Befehl:

scrapy startproject scrapy_example

Dadurch wird automatisch ein Scrapy-Projekt erstellt. Der Name kann beliebig sein. Wenn alles gut gelaufen ist, sollte die Befehlszeile etwas Ähnliches zurückgeben:

New Scrapy project 'scrapy_example', using template directory 'C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\scrapy\templates\project', created in:
C:\Users\Admin\scrapy_example

You can start your first spider with:
	cd scrapy_example
	scrapy genspider example example.com

Mit dem Befehl cd gelangen Sie zum Projektverzeichnis, in diesem Fall zum Verzeichnis scrapy_example. Mit dem Befehl genspider können Sie automatisch einen Scraper mit Grundeinstellungen erstellen. Gehen wir zum Scrapy-Projektverzeichnis und erstellen einen Scraper, um Daten von der Website example.com zu sammeln:

cd scrapy_example
scrapy genspider titles_scrapy_example example.com

Wenn alles in Ordnung ist, wird Folgendes zurückgegeben:

Created spider 'titles_scrapy_example' using template 'basic'

Öffnen Sie den erstellten Scraper (Python-Datei). Er sieht folgendermaßen aus:

import scrapy
class TitlesScrapyExampleSpider(scrapy.Spider):
name="scrapy_exampl"
allowed_domains = ('example.com')
start_urls = ('http://example.com/')
    def parse(self, response):
	pass</code class="language-python">

Ändern wir den Inhalt von def parse(self, Response), sodass der Scraper alle h1-Tags sammelt (unter Verwendung des XPath-Beispiels oben):

    def parse(self, response):
	titles = response.xpath("//h1/text()").extract()
        yield {'titles': titles}

Und schließlich, um den Scraper zu starten, verwenden Sie den Befehl:

scrapy crawl titles_scrapy_example

Die Ergebnisse des Scrapers werden in der Terminalausgabe angezeigt. Natürlich handelt es sich hier um ein sehr einfaches Beispiel eines Schabers, komplexere Modelle unterscheiden sich jedoch in der Regel nur im Detail. Daher wird es keine Schwierigkeiten bereiten, die Grundlagen zu kennen und vollwertige Web-Scraper zu erstellen.

Beim Erstellen eines Projekts erstellt Scrapy auch eine Datei „settings.py“ und eine Datei „middleware.py“, in der man Spider-Middleware und auch Proxy-Einstellungen speichern kann, zum Beispiel:

class ProxyMiddleware(object):
# overwrite process request
def process_request(self, request, spider):
# Set the location of the proxy
	request.meta('proxy') = http://YOUR_PROXY_IP:PORT

Vergessen Sie nicht, Änderungen an der Datei „settings.py“ vorzunehmen:

DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110, 'title_scrapy_example.middlewares.ProxyMiddleware': 100,}

Die Verwendung eines Proxys ist sehr wichtig, um die Sicherheit beim Scraping zu erhöhen und Blockierungen zu vermeiden. Darüber hinaus ist zu bedenken, dass die Nutzung kostenloser Proxys unzuverlässig ist und die Geschwindigkeit deutlich reduziert wird. Es empfiehlt sich, private Proxys zu verwenden.

Wenn kein Wunsch oder keine Möglichkeit besteht, einen Proxy unabhängig zu konfigurieren und zu verwenden und auch eine Blockierung zu vermeiden, gibt es vorgefertigte APIs, die als Vermittler zwischen dem Benutzer und der Site fungieren. Der einfachste Scraper, der unseren Service nutzt, würde beispielsweise so aussehen:

import http.client
import json
conn = http.client.HTTPSConnection("api.scrape-it.cloud")
payload = json.dumps({
	"url": "https://example.com"
	})
headers = {
	'x-api-key': '<your api client>',
	'Content-Type': 'application/json'
	}
conn.request("POST", "/scrape", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

Dies ermöglicht die Umgehung der IP-Blockierung, JavaScript-Rendering, die Verwendung von Wohn- und Rechenzentrums-Proxys sowie die Konfiguration benutzerdefinierter HTTP-Header und benutzerdefinierter Cookies.

Bevor Sie sich endgültig für den Einsatz von Scrapy in Projekten entscheiden, lohnt es sich, es mit anderen beliebten Python-Scraping-Bibliotheken zu vergleichen. Eine davon ist die Beautiful Soup-Bibliothek. Es ist recht einfach und auch für Anfänger geeignet.

Im Gegensatz zu Scrapy mangelt es ihm jedoch an Flexibilität und Skalierbarkeit. Außerdem ist der eingebaute Parser ziemlich langsam.

Beautiful Soup extrahiert problemlos Daten aus HTML- und XML-Dateien. Es sollte jedoch erforderlich sein, zusätzliche Bibliotheken zu verwenden, um eine Anfrage an Webseiten zu senden. Hierzu eignen sich Requests oder die UrlLib-Bibliothek. Für weitere Analysen können html.parser oder Lxml hilfreich sein.

Lassen Sie uns zum Beispiel alle Namen der Waren abrufen, die in den Absätzen p in den Tags h3 gespeichert sind:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
for title in soup.find_all('p'):
print(title.get('h3'))

Aufgrund der Tatsache, dass die Bibliothek vor allem bei Anfängern beliebt ist, hat sich eine recht aktive Community entwickelt. So können Sie schnell die Antwort auf jede Frage finden.

Darüber hinaus verfügt Beautiful Soup über eine vollständige und detaillierte Dokumentation, die das Erlernen sehr erleichtert. Eine detaillierte Beschreibung der Methoden sowie Anwendungsbeispiele finden Sie hier.

selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
elem = driver.find_element_by_name("h3")
driver.close()

Schauen wir uns also die Vergleichstabelle an:

Besonderheit Scrapy Schöne Suppe
Einfaches Lernen Mittel Hoch
Kratzgeschwindigkeit Hoch Niedrig
Flexibilität und Skalierbarkeit Hoch Niedrig
Vollständigkeit der Dokumentation Mittel Hoch
PC-Ressourcenverbrauch Niedrig Mittel

Obwohl das Tool abhängig von den Zielen, Vorgaben und Möglichkeiten ausgewählt werden sollte, ist anzumerken, dass BeautifulSoup eher für Anfänger oder kleine Projekte geeignet ist. Während Scrapy von denjenigen verwendet werden sollte, die bereits einigermaßen mit Scraping in Python vertraut sind und planen, ein flexibles und leicht skalierbares Projekt zu erstellen.

Lesen Sie auch über Python cURL

Scrapy gegen Selen

Selenium ist ein fortschrittlicheres Tool, das das Crawlen von Websites nicht nur mit statischen, sondern auch mit dynamischen Daten ermöglicht. Das heißt, Selenium unterstützt JavaScript dank Headless-Browsern.

Selenium wurde ursprünglich für die Testautomatisierung entwickelt, wodurch diese Bibliothek dabei hilft, das Verhalten eines echten Benutzers zu simulieren. Daher trägt die Verwendung dieser Bibliothek auch dazu bei, das Risiko einer Blockierung zu verringern.

Ein großer Vorteil besteht außerdem darin, dass Selenium problemlos mit AJAX- und PJAX-Anfragen arbeiten kann. Darüber hinaus funktioniert Selenium im Gegensatz zu Scrapy gleichermaßen gut in C#, Java, Python, Ruby und anderen Programmiersprachen.

Schauen wir uns ein ähnliches Beispiel wie für BeautifulSoup an, nur mit Selenium und Headless-Browsern:

selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
elem = driver.find_element_by_name("h3")
driver.close()

Der Code wurde nicht komplizierter, es wurde jedoch möglich, das Verhalten eines echten Benutzers nachzuahmen. Da diese Bibliothek sehr beliebt ist, verfügt sie auch über eine aktive Community und eine gute Dokumentation.

Vergleichen wir also Selenium und Scrapy, um endlich die Vor- und Nachteile zu ermitteln:

Besonderheit Scrapy Selen
Einfaches Lernen Mittel Mittel
Kratzgeschwindigkeit Hoch Mittel
Flexibilität und Skalierbarkeit Hoch Mittel
Vollständigkeit der Dokumentation Mittel Hoch
PC-Ressourcenverbrauch Niedrig Hoch
Fähigkeit, mit Javascript zu arbeiten NEIN Ja

Daher ist es besser, Selenium für komplexe Projekte zu verwenden, bei denen es notwendig ist, mit dynamischen Daten zu arbeiten und das Verhalten eines echten Benutzers zu imitieren. Gleichzeitig eignet sich Scrapy besser für flexible und skalierbare Projekte, bei denen ein geringer Verbrauch von PC-Ressourcen wichtig ist und das Parsen dynamischer Daten keine Rolle spielt.

Fazit und Erkenntnisse

Einer der größten Vorteile von Scrapy besteht darin, dass es sehr einfach ist, ein bereits bestehendes Projekt in ein anderes zu verschieben. Daher ist Scrapy für große oder komplexe Projekte die beste Wahl.

Wenn das Projekt außerdem einen Proxy oder eine Datenpipeline benötigt, ist die Verwendung von Scrapy eine gute Idee. Darüber hinaus gewinnt Scrapy im Vergleich zu Ressourcenverbrauch und Ausführungsgeschwindigkeit unter allen Python-Bibliotheken.

Related Posts

Hinterlasse einen Kommentar