So kratzen Sie Webseiten von der Befehlszeile mit htmlq
Web Scraping ist der Prozess der Analyse der Struktur von HTML-Seiten und der programmgesteuerten Extraktion von Daten aus ihnen. In der Vergangenheit haben wir gesehen, wie man das Web mit der Programmiersprache Python und der Bibliothek "Beautilful Soup" scrapt; In diesem Tutorial sehen wir stattdessen, wie man den gleichen Vorgang mit einem in Rust geschriebenen Befehlszeilentool ausführt: htmlq.
In diesem Tutorial lernen Sie:
- So installieren Sie cargo und htmlq
- So fügen Sie das Verzeichnis ~/.cargo/bin zu PATH hinzu
- So kratzen Sie eine Seite mit curl und htmlq
- So extrahieren Sie ein bestimmtes Tag
- So erhalten Sie den Wert eines bestimmten Tag-Attributs
- So fügen Sie Basis-URLs zu Links hinzu
- So verwenden Sie CSS-Selektoren
- So erhalten Sie Text zwischen Tags
Verwendete Softwareanforderungen und Konventionen
Installation
Htmlq ist eine Anwendung, die mit Rust geschrieben wurde, einer universellen Programmiersprache, die syntaktisch C++ ähnelt. Cargo ist der Rust-Paketmanager: Es ist im Grunde das, was pip für Python ist. In diesem Tutorial werden wir Cargo verwenden, um das htmlq-Tool zu installieren, daher ist das erste, was wir tun müssen, es in unserem System zu installieren.
Cargo einbauen
Das Paket "cargo" ist in den Repositories aller gebräuchlichsten Linux-Distributionen verfügbar. Um beispielsweise "Cargo" auf Fedora zu installieren, verwenden wir einfach den dnf-Paketmanager:
sudo dnf install cargo
Unter Debian und Debian-basierten Distributionen ist eine moderne Art, die Installation durchzuführen, die Verwendung des apt-Wrappers, der entwickelt wurde, um eine benutzerfreundlichere Oberfläche für Befehle wie apt-get und apt-cache bereitzustellen. Der Befehl, den wir ausführen müssen, lautet wie folgt:
sudo apt install cargoWenn Archlinux unsere Lieblings-Linux-Distribution ist, müssen wir nur das Rust-Paket installieren: Cargo ist ein Teil davon. Um diese Aufgabe zu erfüllen, können wir den Paketmanager pacman verwenden:
sudo pacman -Sy rustInstallieren von htmlq
Sobald Cargo installiert ist, können wir es verwenden, um das htmlq-Tool zu installieren. Wir benötigen keine Administratorrechte, um den Vorgang durchzuführen, da wir die Software nur für unseren Benutzer installieren. Um htmlq zu installieren, führen wir Folgendes aus:
cargo install htmlqBinärdateien, die mit cargo installiert werden, werden im Verzeichnis ~/.cargo/bin abgelegt, daher müssen wir das Verzeichnis zu unserem PATH hinzufügen, um das Tool von der Befehlszeile aus aufrufen zu können, ohne jedes Mal den vollständigen Patch angeben zu müssen. In unserer ~/.bash_profile- oder ~/.profile-Datei fügen wir die folgende Zeile hinzu:
export PATH="${PATH}:${HOME}/.cargo/bin"Um die Änderung wirksam zu machen, müssen wir uns abmelden und wieder anmelden, oder als vorübergehende Lösung einfach die Datei neu sourcen:
source ~/.bash_profileAn dieser Stelle sollten wir in der Lage sein, htmlq von unserem Terminal aus aufzurufen. Sehen wir uns einige Beispiele für seine Verwendung an.
Beispiele für die Verwendung von Htmlq
Die gebräuchlichste Art, htmlq zu verwenden, besteht darin, ihm die Ausgabe einer anderen sehr häufig verwendeten Anwendung zu übergeben: curl. Für diejenigen unter Ihnen, die es nicht wissen: Curl ist ein Tool, mit dem Daten von oder zu einem Server übertragen werden können. Wenn es auf einer Webseite ausgeführt wird, wird diese Seitenquelle auf die Standardausgabe zurückgesetzt. Alles, was wir tun müssen, ist, es an HTMLQ weiterzuleiten. Sehen wir uns einige Beispiele an.
Extrahieren eines bestimmten Tags
Angenommen, wir möchten alle Links extrahieren, die auf der Startseite der Website "The New York Times" enthalten sind. Wir wissen, dass die HTML-Links mit dem a-Tag erstellt werden, daher würden wir den folgenden Befehl ausführen:
curl --silent https://www.nytimes.com | htmlq aIm obigen Beispiel haben wir curl mit der Option --silent aufgerufen: Dies soll verhindern, dass die Anwendung den Fortschritt des Seitendownloads oder andere Nachrichten anzeigt, die wir in diesem Fall nicht benötigen. Mit dem Pipe-Operator | haben wir die von curl erzeugte Ausgabe als htmlq-Eingabe verwendet. Wir haben letzteres aufgerufen und den Namen des Tags übergeben, nach dem wir als Argument suchen. Hier ist das (gekürzte) Ergebnis des Befehls:
[...]
<a class="css-1wjnrbv" href="/section/world">World</a>
<a class="css-1wjnrbv" href="/section/us">U.S.</a>
<a class="css-1wjnrbv" href="/section/politics">Politics</a>
<a class="css-1wjnrbv" href="/section/nyregion">N.Y.</a>
<a class="css-1wjnrbv" href="/section/business">Business</a>
<a class="css-1wjnrbv" href="/section/opinion">Opinion</a>
<a class="css-1wjnrbv" href="/section/technology">Tech</a>
<a class="css-1wjnrbv" href="/section/science">Science</a>
<a class="css-1wjnrbv" href="/section/health">Health</a>
<a class="css-1wjnrbv" href="/section/sports">Sports</a>
<a class="css-1wjnrbv" href="/section/arts">Arts</a>
<a class="css-1wjnrbv" href="/section/books">Books</a>
<a class="css-1wjnrbv" href="/section/style">Style</a>
<a class="css-1wjnrbv" href="/section/food">Food</a>
<a class="css-1wjnrbv" href="/section/travel">Travel</a>
<a class="css-1wjnrbv" href="/section/magazine">Magazine</a>
<a class="css-1wjnrbv" href="/section/t-magazine">T Magazine</a>
<a class="css-1wjnrbv" href="/section/realestate">Real Estate</a>
[...]
Wir haben die obige Ausgabe der Einfachheit halber abgeschnitten, aber wir können sehen, dass die gesamten <a>-Tags zurückgegeben wurden. Was ist, wenn wir nur den Wert eines der Tag-Attribute erhalten möchten? In solchen Fällen können wir htmlq einfach mit der Option --attribute aufrufen und das Attribut, dessen Wert wir abrufen möchten, als Argument übergeben. Nehmen wir zum Beispiel an, wir möchten nur den Wert des href-Attributs abrufen, das die tatsächliche URL der Seite ist, zu der die Links gesendet werden. Hier ist, was wir ausführen würden:
curl --silent https://www.nytimes.com | htmlq a --attribute href
Hier ist das Ergebnis, das wir erhalten würden:
[...]
/section/world
/section/us
/section/politics
/section/nyregion
/section/business
/section/opinion
/section/technology
/section/science
/section/health
/section/sports
/section/arts
/section/books
/section/style
/section/food
/section/travel
/section/magazine
/section/t-magazine
/section/realestate
[...]
Abrufen vollständiger Link-URLs
Wie Sie sehen können, werden Links so zurückgegeben, wie sie auf der Seite angezeigt werden. Was dort fehlt, ist die "Basis"-URL, die in diesem Fall https://www.nytimes.com ist. Gibt es eine Möglichkeit, es im Handumdrehen hinzuzufügen? Die Antwort ist ja. Was wir tun müssen, ist, die Option -b (kurz für --base) von htmlq zu verwenden und die Basis-URL, die wir als Argument übergeben möchten:
curl --silent https://www.nytimes.com | htmlq a --attribute href -b https://www.nytimes.comDer obige Befehl würde Folgendes zurückgeben:
[...]
https://www.nytimes.com/section/world
https://www.nytimes.com/section/us
https://www.nytimes.com/section/politics
https://www.nytimes.com/section/nyregion
https://www.nytimes.com/section/business
https://www.nytimes.com/section/opinion
https://www.nytimes.com/section/technology
https://www.nytimes.com/section/science
https://www.nytimes.com/section/health
https://www.nytimes.com/section/sports
https://www.nytimes.com/section/arts
https://www.nytimes.com/section/books
https://www.nytimes.com/section/style
https://www.nytimes.com/section/food
https://www.nytimes.com/section/travel
https://www.nytimes.com/section/magazine
https://www.nytimes.com/section/t-magazine
https://www.nytimes.com/section/realestate
[...]
Abrufen des Textes zwischen Tags
Was ist, wenn wir den Text, der zwischen bestimmten Tags enthalten ist, "extrahieren" möchten? Sagen wir zum Beispiel, wir möchten nur den Text erhalten, der für die auf der Seite vorhandenen Links verwendet wird? Alles, was wir tun müssen, ist, die Option -t (--text) von htmlq zu verwenden:
curl --silent https://www.nytimes.com | htmlq a --textHier ist die Ausgabe, die vom obigen Befehl zurückgegeben wird:
[...]
World
U.S.
Politics
N.Y.
Business
Opinion
Tech
Science
Health
Sports
Arts
Books
Style
Food
Travel
Magazine
T Magazine
Real Estate
[...]
Verwenden von CSS-Selektoren
Bei der Verwendung von htmlq sind wir nicht darauf beschränkt, einfach den Namen des Tags zu übergeben, das wir als Argument abrufen möchten, sondern wir können komplexere CSS-Selektoren verwenden. Hier ist ein Beispiel. Nehmen wir an, dass wir von allen Links, die auf der Seite vorhanden sind, die wir im obigen Beispiel verwendet haben, nur diejenigen mit der Klasse css-jq1cx6 abrufen möchten. Wir würden laufen:
curl --silent https://www.nytimes.com | htmlq a.css-jq1cx6Um alle Tags zu filtern, bei denen das Attribut data-testid vorhanden ist und den Wert "footer-link" hat, würden wir auf ähnliche Weise Folgendes ausführen:
curl --silent https://www.nytimes.com | htmlq a[data-testid="footer-link"]Schlüsse
In diesem Tutorial haben wir gelernt, wie man die htmlq-Anwendung verwendet, um das Scraping von Webseiten über die Befehlszeile durchzuführen. Das Tool ist in Rust geschrieben, daher haben wir gesehen, wie man es mit dem Paketmanager "Cargo" installiert und wie man das Standardverzeichnis, das Cargo zum Speichern von Binärdateien verwendet, zu unserem PATH hinzufügt. Wir haben gelernt, wie man bestimmte Tags von einer Seite abruft, wie man den Wert eines bestimmten Tag-Attributs abruft, wie man eine Basis-URL übergibt, die zu Teillinks hinzugefügt wird, wie man CSS-Selektoren verwendet und schließlich, wie man Text zwischen Tags abruft.
