Programme, die Informationen von Websites lesen, oder Webcrawler, verfügen über alle möglichen nützlichen Anwendungen. Sie können nach Aktieninformationen, Sportergebnissen, Text von einem Twitter-Konto suchen oder Preise von Einkaufswebsites abrufen.
Das Schreiben dieser Web-Crawling-Programme ist einfacher, als Sie vielleicht denken. Python verfügt über eine großartige Bibliothek zum Schreiben von Skripten, die Informationen von Websites extrahieren. Sehen wir uns an, wie Sie mit Scrapy einen Webcrawler erstellen.
Scrapy installieren
kratzig ist eine Python-Bibliothek, die erstellt wurde, um das Web zu durchsuchen und Webcrawler zu erstellen. Es ist schnell, einfach und kann ohne großen Aufwand durch mehrere Webseiten navigieren.
Scrapy ist über die Pip Installs Python (PIP)-Bibliothek verfügbar, hier ist eine Auffrischung auf So installieren Sie PIP unter Windows, Mac und Linux .
Die Verwendung einer virtuellen Python-Umgebung wird bevorzugt, da Sie Scrapy in einem virtuellen Verzeichnis installieren können, das Ihre Systemdateien in Ruhe lässt. In der Dokumentation von Scrapy wird empfohlen, dies zu tun, um die besten Ergebnisse zu erzielen.
Erstellen Sie ein Verzeichnis und initialisieren Sie eine virtuelle Umgebung.
So drehen Sie eine Tabelle in Word
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate
Sie können Scrapy jetzt mit einem PIP-Befehl in dieses Verzeichnis installieren.
pip install scrapy
Ein kurzer Check, um sicherzustellen, dass Scrapy richtig installiert ist
scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
...
So erstellen Sie einen Web-Crawler
Nachdem die Umgebung nun bereit ist, können Sie mit der Erstellung des Web-Crawlers beginnen. Lassen Sie uns einige Informationen aus einer Wikipedia-Seite zu Batterien herauskratzen: https://en.wikipedia.org/wiki/Battery_(Strom) .
Der erste Schritt zum Schreiben eines Crawlers besteht darin, eine Python-Klasse zu definieren, die sich von Scrapy.Spider . Damit haben Sie Zugriff auf alle Funktionen und Features von Scrapy. Nennen wir diese Klasse Spinne1 .
Eine Spinnenklasse benötigt ein paar Informationen:
- zu Name zur Identifizierung der Spinne
- zu start_urls Variable, die eine Liste von URLs enthält, von denen gecrawlt werden soll (die Wikipedia-URL ist das Beispiel in diesem Tutorial)
- zu analysieren() Methode, die verwendet wird, um die Webseite zu verarbeiten, um Informationen zu extrahieren
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass
Ein kurzer Test, um sicherzustellen, dass alles richtig läuft.
scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...
Logging deaktivieren
Wenn Sie Scrapy mit dieser Klasse ausführen, werden Protokollinformationen ausgegeben, die Ihnen im Moment nicht weiterhelfen. Machen wir es uns einfach, indem wir diese überschüssigen Protokollinformationen entfernen. Benutze einen Warnung -Anweisung durch Hinzufügen von Code am Anfang der Datei.
import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)
Wenn Sie das Skript jetzt erneut ausführen, werden die Protokollinformationen nicht gedruckt.
Verwenden des Chrome-Inspektors
Alles auf einer Webseite wird in HTML-Elementen gespeichert. Die Elemente sind im Document Object Model (DOM) angeordnet. Das Verständnis des DOM ist entscheidend, um das Beste aus Ihrem Webcrawler herauszuholen. Ein Webcrawler durchsucht alle HTML-Elemente auf einer Seite, um Informationen zu finden. Daher ist es wichtig zu wissen, wie sie angeordnet sind.
Google Chrome verfügt über Tools, mit denen Sie HTML-Elemente schneller finden. Sie können den HTML-Code für jedes Element finden, das Sie auf der Webseite sehen, indem Sie den Inspektor verwenden.
- Navigieren Sie zu einer Seite in Chrome
- Platzieren Sie die Maus auf dem Element, das Sie anzeigen möchten
- Klicken Sie mit der rechten Maustaste und wählen Sie Prüfen aus der Speisekarte
Diese Schritte öffnen die Entwicklerkonsole mit dem Elemente Registerkarte ausgewählt. Unten in der Konsole sehen Sie eine Baumstruktur mit Elementen. In diesem Baum erhalten Sie Informationen für Ihr Skript.
Extrahieren des Titels
Lassen Sie uns das Skript dazu bringen, etwas Arbeit für uns zu erledigen; Ein einfacher Crawl, um den Titeltext der Webseite abzurufen.
Starten Sie das Skript, indem Sie dem Code hinzufügen analysieren() Methode, die den Titel extrahiert.
...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...
Die Antwort Argument unterstützt eine Methode namens CSS() die Elemente von der Seite unter Verwendung des von Ihnen angegebenen Speicherorts auswählt.
In diesem Beispiel ist das Element h1.firstHeading . Hinzufügen
::text
zum Skript gibt Ihnen den Textinhalt des Elements. Endlich, das Extrakt() Methode gibt das ausgewählte Element zurück.
Wenn Sie dieses Skript in Scrapy ausführen, wird der Titel in Textform gedruckt.
[u'Battery (electricity)']
Die Beschreibung finden
Nachdem wir nun den Titeltext abgekratzt haben, machen wir mehr mit dem Skript. Der Crawler sucht den ersten Absatz nach dem Titel und extrahiert diese Informationen.
Hier ist die Elementstruktur in der Chrome-Entwicklerkonsole:
wie man dasselbe Programm zweimal gleichzeitig ausführt
div#mw-content-text>div>p
Der rechte Pfeil (>) zeigt eine Eltern-Kind-Beziehung zwischen den Elementen an.
Dieser Speicherort gibt alle . zurück P Elemente übereinstimmen, die die gesamte Beschreibung enthält. Um den ersten zu bekommen P Element können Sie diesen Code schreiben:
response.css('div#mw-content-text>div>p')[0]
Genau wie der Titel fügen Sie einen CSS-Extraktor hinzu
::text
um den Textinhalt des Elements zu erhalten.
response.css('div#mw-content-text>div>p')[0].css('::text')
Der letzte Ausdruck verwendet Extrakt() um die Liste zurückzugeben. Sie können Python verwenden beitreten() -Funktion, um der Liste beizutreten, sobald das Crawling abgeschlossen ist.
def parse(self, response):
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())
Das Ergebnis ist der erste Absatz des Textes!
An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...
Sammeln von JSON-Daten
Scrapy kann Informationen in Textform extrahieren, was nützlich ist. Mit Scrapy können Sie auch die Daten JavaScript Object Notation (JSON) anzeigen. JSON ist eine übersichtliche Methode zum Organisieren von Informationen und wird häufig in der Webentwicklung verwendet. JSON funktioniert ziemlich gut mit Python sowie.
Wenn Sie Daten als JSON sammeln müssen, können Sie die Ertrag -Anweisung in Scrapy integriert.
Hier ist eine neue Version des Skripts mit einer yield-Anweisung. Anstatt das erste p-Element im Textformat zu erhalten, werden alle p-Elemente erfasst und im JSON-Format organisiert.
was ist virtueller speicher windows 10
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...
Sie können den Spider jetzt ausführen, indem Sie eine JSON-Ausgabedatei angeben:
scrapy runspider spider3.py -o joe.json
Das Skript druckt nun alle p-Elemente.
[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...
Mehrere Elemente abkratzen
Bisher hat der Webcrawler den Titel und eine Art Element von der Seite gekratzt. Scrapy kann auch Informationen aus verschiedenen Arten von Elementen in einem Skript extrahieren.
Lassen Sie uns die besten IMDb Box Office-Hits für ein Wochenende extrahieren. Diese Informationen stammen aus http://www.imdb.com/chart/boxoffice , in einer Tabelle mit Zeilen für jede Metrik.
Die analysieren() -Methode kann mehr als ein Feld aus der Zeile extrahieren. Mit den Chrome-Entwicklertools können Sie die in der Tabelle verschachtelten Elemente finden.
...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...
Die Bild Selektor gibt an, dass img ist ein Nachkomme von td.posterColumn . Um das richtige Attribut zu extrahieren, verwenden Sie den Ausdruck |_+_|.
Das Ausführen der Spinne gibt JSON zurück:
::attr(src)
Mehr Web-Scraper und Bots
Scrapy ist eine detaillierte Bibliothek, die fast jede Art von Web-Crawling durchführen kann, die Sie anfordern. Wenn es darum geht, Informationen in HTML-Elementen zu finden, kombiniert mit der Unterstützung von Python, ist es kaum zu schlagen. Egal, ob Sie einen Webcrawler erstellen oder sich mit den Grundlagen des Web-Scrapings vertraut machen, die einzige Grenze besteht darin, wie viel Sie zu lernen bereit sind.
Wenn Sie nach weiteren Möglichkeiten suchen, Crawler oder Bots zu erstellen, können Sie es versuchen Twitter- und Instagram-Bots mit Python erstellen . Python kann einige erstaunliche Dinge in der Webentwicklung aufbauen, daher lohnt es sich, bei der Erforschung dieser Sprache über Webcrawler hinauszugehen.
Teilen Teilen Tweet Email 15 Windows-Eingabeaufforderungsbefehle (CMD), die Sie kennen müssenDie Eingabeaufforderung ist immer noch ein leistungsstarkes Windows-Tool. Hier sind die nützlichsten CMD-Befehle, die jeder Windows-Benutzer kennen muss.
Weiter lesen Verwandte Themen- Programmierung
- Webmaster werkzeuge
- Programmierung
- Python
- Codierungs-Tutorials
- Web-Crawler
Anthony Grant ist ein freiberuflicher Autor für Programmierung und Software. Er ist ein Informatik-Major und beschäftigt sich mit Programmierung, Excel, Software und Technologie.
Mehr von Anthony GrantAbonniere unseren Newsletter
Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!
Klicken Sie hier, um zu abonnieren