Wie man Webseiten mit schöner Suppe und Python kratzt 3

Einführung

Viele Datenanalyse-, Big-Data- und Maschinelles-Lernen-Projekte erfordern das Scrappen von Websites, um die Daten zu erfassen, mit denen Sie arbeiten werden. Die Programmiersprache Python ist in der Data-Science-Community weit verbreitet und verfügt daher über ein Ökosystem von Modulen und Tools, die Sie in Ihren eigenen Projekten verwenden können. In diesem Tutorial werden wir uns auf das Beautiful Soup-Modul konzentrieren.

Beautiful Soup, eine Anspielung auf das Lied von Mock Turtle aus Kapitel 10 von Lewis Carrolls Alice’s Adventures in Wonderland ist eine Python-Bibliothek, die eine schnelle Bearbeitung von Web-Scraping-Projekten ermöglicht. Derzeit als Beautiful Soup 4 erhältlich und mit Python 2.7 und Python 3 kompatibel, erstellt Beautiful Soup einen Analysebaum aus geparsten HTML- und XML-Dokumenten (einschließlich Dokumenten mit nicht geschlossenen Tags oder https://en.wikipedia.org/wiki/Tag_soup) [Markensuppe] und andere fehlerhafte Markups).

In diesem Tutorial sammeln und analysieren wir eine Webseite, um Textdaten zu erfassen und die gesammelten Informationen in eine CSV-Datei zu schreiben.

Voraussetzungen

Sie sollten die Requests and Beautiful Soup-Module * installiert * haben. Dies können Sie erreichen, indem Sie unserem Tutorial „https://www.digitalocean.com/community/tutorials/how-to-work-with-web-data-using-“ folgen. request-and-beautiful-soup-with-python-3 [Arbeiten mit Webdaten mithilfe von Requests und Beautiful Soup mit Python 3]. ”Es wäre auch hilfreich, mit diesen Modulen vertraut zu sein.

Da wir mit Daten arbeiten, die aus dem Web stammen, sollten Sie außerdem mit der HTML-Struktur und dem Markieren vertraut sein.

Daten verstehen

In diesem Tutorial arbeiten wir mit Daten von der offiziellen Website der National Gallery of Art in den USA. Die National Gallery ist ein Kunstmuseum in der National Mall in Washington, DC. Es beherbergt über 120.000 Werke von mehr als 13.000 Künstlern aus der Renaissance bis zur Gegenwart.

Wir möchten im Künstlerverzeichnis suchen, das zum Zeitpunkt der Aktualisierung dieses Tutorials über Internet Archive unter Wayback verfügbar ist Maschine unter der folgenden URL:

  • https: //web.archive.org/web/20170131230332/https: //www.nga.gov/collection/an.shtm*

Unter der Überschrift des Internetarchivs sehen Sie eine Seite, die folgendermaßen aussieht:

Da wir dieses Projekt durchführen, um mehr über das Web-Scraping mit Beautiful Soup zu erfahren, müssen wir nicht zu viele Daten von der Site abrufen. Beschränken Sie also den Umfang der zu scrapenden Künstlerdaten. Wählen wir daher einen Buchstaben aus - in unserem Beispiel wählen wir den Buchstaben * Z * - und sehen eine Seite, die so aussieht:

image: https: //assets.digitalocean.com/articles/eng_python/beautiful-soup/artist-names-beginning-with-z-2018.png [Künstlernamen beginnend mit der Z-Liste]

Auf der obigen Seite sehen wir, dass der erste zum Zeitpunkt des Schreibens aufgeführte Künstler * Zabaglia, Niccola * ist, was zu beachten ist, wenn wir mit dem Abrufen von Daten beginnen. Wir beginnen mit dieser ersten Seite mit der folgenden URL für den Buchstaben * Z *:

Es ist wichtig, zu einem späteren Zeitpunkt zu notieren, wie viele Seiten insgesamt für den Buchstaben vorhanden sind, den Sie auflisten möchten, indem Sie auf die letzte Seite der Interpreten klicken. In diesem Fall sind es insgesamt 4 Seiten, und der letzte zum Zeitpunkt des Schreibens aufgeführte Künstler ist * Zykmund, Václav *. Die letzte Seite von * Z * -Künstlern hat die folgende URL:

  • https: //web.archive.org/web/20121010201041/http: //www.nga.gov/collection/anZ4.htm [https://web.archive.org/web/20121010201041/http://www .nga.gov / collection / an4.htm] *

  • Sie können jedoch * auch auf die oben genannte Seite zugreifen, indem Sie dieselbe Internet Archive-Zeichenfolge wie auf der ersten Seite verwenden:

  • https: //web.archive.org/web/20121007172955/http: //www.nga.gov/collection/anZ4.htm [https://web.archive.org/web//http://www. nga.gov/collection/an4.htm weibl.

Dies ist wichtig zu beachten, da wir diese Seiten später in diesem Lernprogramm durchlaufen werden.

Um sich mit der Einrichtung dieser Webseite vertraut zu machen, können Sie deren DOM besuchen, die Ihnen dabei helfen wird Verstehe, wie das HTML aufgebaut ist. Um das DOM zu überprüfen, können Sie die Developer Tools öffnen .

Importieren der Bibliotheken

Aktivieren Sie zunächst unsere Python 3-Programmierumgebung. Stellen Sie sicher, dass Sie sich in dem Verzeichnis befinden, in dem sich Ihre Umgebung befindet, und führen Sie den folgenden Befehl aus:

. /bin/activate

Wenn unsere Programmierumgebung aktiviert ist, erstellen wir eine neue Datei, beispielsweise mit Nano. Sie können Ihrer Datei einen beliebigen Namen geben. In diesem Lernprogramm nennen wir sie "+ nga_z_artists.py +".

nano

In dieser Datei können wir anfangen, die Bibliotheken zu importieren, die wir verwenden werden - Requests und Beautiful Soup.

Die Requests-Bibliothek ermöglicht es Ihnen, HTTP in Ihren Python-Programmen auf eine für Menschen lesbare Weise zu verwenden, und das Beautiful Soup-Modul wurde entwickelt, um Web-Scraping schnell durchzuführen.

Wir werden sowohl Requests als auch Beautiful Soup mit der https://www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3 [+ import + Anweisung] importieren. Für Beautiful Soup importieren wir es aus + bs4 +, dem Paket, in dem Beautiful Soup 4 enthalten ist.

nga_z_artists.py

# Import libraries
import requests
from bs4 import BeautifulSoup

Nachdem sowohl das Requests- als auch das Beautiful Soup-Modul importiert wurden, können wir weiterarbeiten, um zuerst eine Seite zu sammeln und sie dann zu analysieren.

Sammeln und Analysieren einer Webseite

Der nächste Schritt, den wir tun müssen, ist die URL der ersten Webseite mit Anfragen zu sammeln. Wir weisen die URL für die erste Seite der variable "+ page " zu, indem wir den http verwenden : //docs.python-requests.org/en/master/user/quickstart/#make-a-request [Methode ` request.get () +`].

nga_z_artists.py

import requests
from bs4 import BeautifulSoup


# Collect first page of artists’ list

Wir erstellen jetzt ein "+ BeautifulSoup " - Objekt oder einen Analysebaum. Dieses Objekt verwendet als Argumente das " page.text " - Dokument aus "Requests" (den Inhalt der Serverantwort) und analysiert es dann aus Pythons integriertem https://docs.python.org/3/library/html.parser .html [` html.parser +`].

nga_z_artists.py

import requests
from bs4 import BeautifulSoup


page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')

# Create a BeautifulSoup object

Wenn unsere Seite gesammelt, analysiert und als "+ BeautifulSoup +" - Objekt eingerichtet ist, können wir die gewünschten Daten sammeln.

Abrufen von Text von einer Webseite

Für dieses Projekt sammeln wir Künstlernamen und die relevanten Links, die auf der Website verfügbar sind. Möglicherweise möchten Sie verschiedene Daten erfassen, z. B. die Nationalität und die Daten der Künstler. Welche Daten Sie auch sammeln möchten, Sie müssen herausfinden, wie sie vom DOM der Webseite beschrieben werden.

Klicken Sie dazu in Ihrem Webbrowser mit der rechten Maustaste auf den Namen des ersten Künstlers, * Zabaglia, Niccola *. Innerhalb des Kontextmenüs, das angezeigt wird, sollte ein Menüelement angezeigt werden, das * Inspect Element * (Firefox) oder * Inspect * (Chrome) ähnelt.

image: https: //assets.digitalocean.com/articles/eng_python/beautiful-soup/inspect-element.png [Kontextmenü - Inspect Element]

Sobald Sie auf den entsprechenden Menüpunkt * Inspizieren * klicken, sollten die Tools für Webentwickler in Ihrem Browser angezeigt werden. Wir möchten nach der Klasse und den Tags suchen, die mit den Künstlernamen in dieser Liste verknüpft sind.

Wir werden zuerst sehen, dass sich die Tabelle der Namen innerhalb der Tags "+ <div> " befindet, wobei " class =" BodyText "" ist. Dies ist wichtig zu beachten, damit wir nur in diesem Abschnitt der Webseite nach Text suchen. Wir bemerken auch, dass der Name * Zabaglia, Niccola * in einem Link-Tag steht, da der Name auf eine Webseite verweist, die den Künstler beschreibt. Daher möchten wir das Tag " <a> +" für Links referenzieren. Der Name jedes Künstlers ist ein Verweis auf einen Link.

Dazu verwenden wir die Methoden + find () + und + find_all () + von Beautiful Soup, um den Text der Künstlernamen aus dem + BodyText + + <div> + zu ziehen .

nga_z_artists.py

import requests
from bs4 import BeautifulSoup


# Collect and parse first page
page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')
soup = BeautifulSoup(page.text, 'html.parser')

# Pull all text from the BodyText div


# Pull text from all instances of <a> tag within BodyText div

Als nächstes wollen wir am Ende unserer Programmdatei eine https://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-python-3 [+ for + erstellen loop], um über alle Künstlernamen zu iterieren, die wir gerade in die Variable + artist_name_list_items + eingegeben haben.

Wir drucken diese Namen mit der Methode "+ prettify () +" aus, um den Syntaxanalysebaum "Beautiful Soup" in eine schön formatierte Unicode-Zeichenfolge umzuwandeln.

nga_z_artists.py

...
artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

# Create for loop to print out all artists' names

Führen wir das Programm so aus, wie wir es bisher haben:

python nga_z_artists.py

Sobald wir dies tun, erhalten wir die folgende Ausgabe:

Output<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630">
Zabaglia, Niccola
</a>
...
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=3427">
Zao Wou-Ki
</a>
<a href="/web/20121007172955/https://www.nga.gov/collection/anZ2.htm">
Zas-Zie
</a>

<a href="/web/20121007172955/https://www.nga.gov/collection/anZ3.htm">
Zie-Zor
</a>

<a href="/web/20121007172955/https://www.nga.gov/collection/anZ4.htm">
<strong>
 next
 <br/>
 page
</strong>
</a>

Was wir an dieser Stelle in der Ausgabe sehen, sind der vollständige Text und die Tags, die sich auf alle Künstlernamen beziehen, die sich in den Tags "+ <a> " befinden, die sich im Tag " <div class =" BodyText "> +" on "befinden die erste Seite, sowie einige zusätzliche Link-Text am unteren Rand. Da wir diese zusätzlichen Informationen nicht benötigen, arbeiten wir im nächsten Abschnitt daran, diese zu entfernen.

Überflüssige Daten entfernen

Bisher konnten wir alle Linktextdaten in einem "+ <div> +" - Abschnitt unserer Webseite sammeln. Wir möchten jedoch keine unteren Links haben, die nicht auf Künstlernamen verweisen. Lassen Sie uns also daran arbeiten, diesen Teil zu entfernen.

Um die unteren Links der Seite zu entfernen, klicken Sie erneut mit der rechten Maustaste und * inspizieren * Sie das DOM. Wir werden sehen, dass die Links unten im Abschnitt "+ <div class =" BodyText "> " in einer HTML-Tabelle enthalten sind: " <table class =" AlphaNav "> +":

image: https: //assets.digitalocean.com/articles/eng python / beautifulsoup / html-table.png [Links in der HTML-Tabelle von Alpha Nav]

Wir können daher Beautiful Soup verwenden, um die Klasse "+ AlphaNav " zu finden, und die Methode " decompose () +" verwenden, um ein Tag aus dem Analysebaum zu entfernen und es dann zusammen mit seinem Inhalt zu zerstören.

Wir werden die Variable "+ last_links +" verwenden, um auf diese unteren Links zu verweisen und sie der Programmdatei hinzuzufügen:

nga_z_artists.py

import requests
from bs4 import BeautifulSoup


page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

# Remove bottom links



artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

for artist_name in artist_name_list_items:
   print(artist_name.prettify())

Wenn wir das Programm jetzt mit dem Befehl "+ python nga_z_artist.py +" ausführen, erhalten wir die folgende Ausgabe:

Output<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630">
Zabaglia, Niccola
</a>
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=34202">
Zaccone, Fabian
</a>
...
<a href="/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=11631">
Zanotti, Giampietro
</a>
<a href="/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=3427">
Zao Wou-Ki
</a>

An dieser Stelle sehen wir, dass die Ausgabe die Links am unteren Rand der Webseite nicht mehr enthält und nur noch die Links anzeigt, die mit den Künstlernamen verknüpft sind.

Bisher haben wir die Verknüpfungen mit den Künstlernamen gezielt ausgewählt, aber wir haben die zusätzlichen Tag-Daten, die wir nicht wirklich wollen. Entfernen wir das im nächsten Abschnitt.

Inhalt aus einem Tag ziehen

Um nur auf die Namen der Künstler zuzugreifen, möchten wir den Inhalt der "+ <a> +" - Tags als Ziel festlegen, anstatt den gesamten Link-Tag auszudrucken.

Wir können dies mit + .contents + von Beautiful Soup tun, das die Kinder des Tags als Python zurückgibt. Https://www.digitalocean.com/community/tutorials/understanding-lists-in-python-3[list data type] .

Lassen Sie uns die "+ für +" -Schleife überarbeiten, sodass statt des Druckens des gesamten Links und seines Tags die Liste der untergeordneten Elemente (d. H. die vollständigen Namen der Künstler):

nga_z_artists.py

import requests
from bs4 import BeautifulSoup


page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

# Use .contents to pull out the <a> tag’s children
for artist_name in artist_name_list_items:

Beachten Sie, dass wir die obige Liste durchlaufen, indem wir die index number jedes Elements aufrufen.

Wir können das Programm mit dem Befehl "+ python" ausführen, um die folgende Ausgabe anzuzeigen:

OutputZabaglia, Niccola
Zaccone, Fabian
Zadkine, Ossip
...
Zanini-Viola, Giuseppe
Zanotti, Giampietro
Zao Wou-Ki

Wir haben eine Liste aller auf der ersten Seite des Buchstabens * Z * verfügbaren Künstlernamen zurückerhalten.

Was ist jedoch, wenn wir auch die mit diesen Künstlern verknüpften URLs erfassen möchten? Wir können URLs extrahieren, die in den + <a> + -Tags einer Seite gefunden wurden, indem wir die + get ('href') + -Methode von Beautiful Soup verwenden.

Aus der Ausgabe der obigen Links geht hervor, dass nicht die gesamte URL erfasst wird. Daher werden wir https://www.digitalocean.com/community/tutorials/an-einführung-zum-arbeiten-mit-Strings-in- python-3 # string-concatenation [verketten] Sie die Verknüpfungszeichenfolge mit der Vorderseite der URL-Zeichenfolge (in diesem Fall "+ https: // web.archive.org / +").

Diese Zeilen werden auch zur + for-Schleife hinzugefügt:

nga_z_artists.py

...
for artist_name in artist_name_list_items:
   names = artist_name.contents[0]

   print(names)

Wenn wir das obige Programm ausführen, erhalten wir * sowohl * die Künstlernamen als auch die URLs zu den Links, die uns mehr über die Künstler erzählen:

OutputZabaglia, Niccola
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630
Zaccone, Fabian
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=34202
...
Zanotti, Giampietro
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11631
Zao Wou-Ki
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=3427

Obwohl wir jetzt Informationen von der Website erhalten, werden diese derzeit nur in unserem Terminalfenster gedruckt. Erfassen wir stattdessen diese Daten, damit wir sie an anderer Stelle verwenden können, indem wir sie in eine Datei schreiben.

Daten in eine CSV-Datei schreiben

Das Sammeln von Daten, die nur in einem Terminalfenster gespeichert sind, ist nicht sehr nützlich. CSV-Dateien (Comma-Separated Values) ermöglichen das Speichern tabellarischer Daten im Nur-Text-Format und sind ein gängiges Format für Tabellenkalkulationen und Datenbanken. Bevor Sie mit diesem Abschnitt beginnen, sollten Sie sich mit Handhabung von Nur-Text-Dateien in vertraut machen Python.

Zuerst müssen wir das in Python integrierte "+ csv +" - Modul zusammen mit den anderen Modulen oben in der Python-Programmierdatei importieren:

import csv

Als Nächstes erstellen und öffnen wir eine Datei mit dem Namen "+ .csv " für uns unter https://www.digitalocean.com/community/tutorials/how-to-handle-plain-text-files-in-python-3 # step-4-% E2% 80% 94-writing-a-file [write to] (wir verwenden die Variable ` f ` für die Datei hier) mit dem Modus ` 'w' `. Wir schreiben auch die Überschriften der obersten Zeile: " Name " und " Link ", die wir als Liste an die Methode " writerow () +" übergeben:

f = csv.writer(open('z-artist-names.csv', 'w'))
f.writerow(['Name', 'Link'])

Schließlich schreiben wir in einer "+ für" -Schleife jede Zeile mit den "+ Namen" der Künstler und den zugehörigen "+ Links +":

f.writerow([names, links])

Sie können die Zeilen für jede dieser Aufgaben in der folgenden Datei sehen:

nga_z_artists.py

import requests

from bs4 import BeautifulSoup


page = requests.get('https://web.archive.org/web/20121007172955/http://www.nga.gov/collection/anZ1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

# Create a file to write to, add headers row



artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

for artist_name in artist_name_list_items:
   names = artist_name.contents[0]
   links = 'https://web.archive.org' + artist_name.get('href')


   # Add each artist’s name and associated link to a row

Wenn Sie das Programm jetzt mit dem Befehl "+ python" ausführen, wird keine Ausgabe an Ihr Terminalfenster zurückgegeben. Stattdessen wird eine Datei mit dem Namen "+ .csv +" in dem Verzeichnis erstellt, in dem Sie gerade arbeiten.

Abhängig davon, was Sie zum Öffnen verwenden, sieht es möglicherweise so aus:

z-artist-names.csv

Name,Link
"Zabaglia, Niccola",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=11630
"Zaccone, Fabian",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=34202
"Zadkine, Ossip",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=3475w
...

Oder es sieht eher aus wie eine Tabelle:

In beiden Fällen können Sie diese Datei jetzt verwenden, um auf sinnvollere Weise mit den Daten zu arbeiten, da die von Ihnen gesammelten Informationen jetzt im Speicher Ihres Computers gespeichert werden.

Verwandte Seiten abrufen

Wir haben ein Programm erstellt, das Daten von der ersten Seite der Liste der Künstler abruft, deren Nachnamen mit dem Buchstaben * Z * beginnen. Es sind jedoch insgesamt 4 Seiten dieser Künstler auf der Website verfügbar.

Um all diese Seiten zu sammeln, können wir mehr Iterationen mit + for-Schleifen durchführen. Dadurch wird der größte Teil des Codes, den wir bisher geschrieben haben, überarbeitet, es werden jedoch ähnliche Konzepte verwendet.

Zunächst möchten wir eine Liste mit den Seiten initialisieren:

pages = []

Wir füllen diese Initialisierungsliste mit der folgenden "+ for" -Schleife:

for i in range(1, 5):
   url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ' + str(i) + '.htm'
   pages.append(url)

Erlier in diesem Tutorial, haben wir festgestellt dass wir auf die Gesamtzahl der Seiten achten sollten, die Künstlernamen enthalten, die mit dem Buchstaben * Z * (oder dem Buchstaben, den wir verwenden) beginnen. Da es 4 Seiten für den Buchstaben * Z * gibt, haben wir die oben stehende "+ für " -Schleife mit einem Bereich von " 1 " bis " 5 +" konstruiert, damit sie jede der 4 Seiten durchläuft.

Für diese spezielle Website beginnen die URLs mit der Zeichenfolge "+ https: //web.archive.org/web/20121007172955/https: // www.nga.gov / collection / anZ ", gefolgt von einer Nummer für Die Seite (die die Ganzzahl " i " aus der " for " - Schleife ist, die wir https://www.digitalocean.com/community/tutorials/how-to-convert-data-types-in-python-3 [in einen String konvertieren]) und mit ` .htm ` enden. Wir werden diese Zeichenketten miteinander verketten und dann das Ergebnis an die Liste " pages +" anhängen.

Zusätzlich zu dieser Schleife gibt es eine zweite Schleife, die durch jede der oben genannten Seiten geht. Der Code in dieser "+ für " - Schleife ähnelt dem Code, den wir bisher erstellt haben, da er die Aufgabe erfüllt, die wir für die erste Seite des Buchstabens * Z * artists für jede der insgesamt 4 Seiten ausgeführt haben. Da wir das ursprüngliche Programm in die zweite " für" -Schleife gestellt haben, haben wir jetzt die ursprüngliche Schleife als https://www.digitalocean.com/community/tutorials/how-to-construct-for-loops- in-python-3 # nested-for-loops [verschachtelte + for + - Schleife].

Die beiden + for-Schleifen sehen folgendermaßen aus:

pages = []

for i in range(1, 5):
   url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ' + str(i) + '.htm'
   pages.append(url)

for item in pages:
   page = requests.get(item)
   soup = BeautifulSoup(page.text, 'html.parser')

   last_links = soup.find(class_='AlphaNav')
   last_links.decompose()

   artist_name_list = soup.find(class_='BodyText')
   artist_name_list_items = artist_name_list.find_all('a')

   for artist_name in artist_name_list_items:
       names = artist_name.contents[0]
       links = 'https://web.archive.org' + artist_name.get('href')

       f.writerow([names, links])

Im obigen Code sollten Sie sehen, dass die erste "+ für " -Schleife über die Seiten iteriert und die zweite " für +" -Schleife Daten von jeder dieser Seiten abkratzt und dann die Namen und Links der Künstler zeilenweise hinzufügt durch jede Zeile jeder Seite.

Diese beiden "+ für" -Schleifen stehen unter den "+ import " -Anweisungen, der Erstellung und dem Schreiben von CSV-Dateien (mit der Zeile zum Schreiben der Header der Datei) und der Initialisierung der Variablen " pages +" (einer Liste zugewiesen) ).

Im größeren Kontext der Programmierdatei sieht der vollständige Code folgendermaßen aus:

nga_z_artists.py

import requests
import csv
from bs4 import BeautifulSoup


f = csv.writer(open('z-artist-names.csv', 'w'))
f.writerow(['Name', 'Link'])

pages = []

for i in range(1, 5):
   url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ' + str(i) + '.htm'
   pages.append(url)


for item in pages:
   page = requests.get(item)
   soup = BeautifulSoup(page.text, 'html.parser')

   last_links = soup.find(class_='AlphaNav')
   last_links.decompose()

   artist_name_list = soup.find(class_='BodyText')
   artist_name_list_items = artist_name_list.find_all('a')

   for artist_name in artist_name_list_items:
       names = artist_name.contents[0]
       links = 'https://web.archive.org' + artist_name.get('href')

       f.writerow([names, links])

Da dieses Programm ein wenig Arbeit leistet, dauert es eine Weile, bis die CSV-Datei erstellt ist. Sobald dies erledigt ist, ist die Ausgabe vollständig und zeigt die Namen der Künstler und die dazugehörigen Links von * Zabaglia, Niccola * bis * Zykmund, Václav *.

Rücksichtsvoll sein

Beim Scraping von Webseiten ist es wichtig, die Server zu berücksichtigen, von denen Sie Informationen abrufen.

Überprüfen Sie, ob für eine Website Nutzungsbedingungen oder Nutzungsbedingungen für das Web-Scraping gelten. Überprüfen Sie außerdem, ob eine Site über eine API verfügt, mit der Sie Daten abrufen können, bevor Sie sie selbst scrappen.

Achten Sie darauf, Server nicht ständig zu treffen, um Daten zu sammeln. Nachdem Sie die benötigten Informationen von einer Site gesammelt haben, führen Sie Skripts aus, die die Daten lokal durchgehen, anstatt die Server anderer Benutzer zu belasten.

Darüber hinaus empfiehlt es sich, einen Header mit Ihrem Namen und Ihrer E-Mail-Adresse zu verwenden, damit eine Website Sie identifizieren und bei Fragen nachverfolgen kann. Ein Beispiel für einen Header, den Sie mit der Python Requests-Bibliothek verwenden können, lautet wie folgt:

import requests

headers = {
   'User-Agent': ', ',
   'From': ''
}

url = 'https://.com'

page = requests.get(url, headers = headers)

Durch die Verwendung von Headern mit identifizierbaren Informationen wird sichergestellt, dass die Personen, die die Protokolle eines Servers durchsuchen, Sie erreichen können.

Fazit

In diesem Tutorial wurden mithilfe von Python und Beautiful Soup Daten von einer Website gelöscht. Wir haben den gesammelten Text in einer CSV-Datei gespeichert.

Sie können an diesem Projekt weiterarbeiten, indem Sie mehr Daten erfassen und Ihre CSV-Datei stabiler gestalten. Sie können beispielsweise die Nationalitäten und die Jahre der einzelnen Künstler angeben. Sie können das Gelernte auch verwenden, um Daten von anderen Websites zu entfernen.

Weitere Informationen zum Abrufen von Informationen aus dem Internet finden Sie in unserem Lernprogramm „https://www.digitalocean.com/community/tutorials/how-to-crawl-a-web-page-with-scrapy-and-python-3 [ So crawlen Sie eine Webseite mit Scrapy und Python 3].