Haben Sie sich jemals gefragt, wie Sie mit Messaging-Apps wie WhatsApp oder Telegram eine Vorschau eines von Ihnen gesendeten Links sehen können?
In diesem Beitrag erstellen wir mit Deno eine Scraping-API, die eine URL akzeptiert und die Meta-Tags dafür abruft, sodass wir Felder wie Titel, Beschreibung, Bild und mehr von fast jeder Website abrufen können.
Zum Beispiel:
curl https://metatags.deno.dev/api/meta?url=https://dev.to
wird dieses Ergebnis liefern
{ "last-updated": "2024-10-15 15:10:02 UTC", "user-signed-in": "false", "head-cached-at": "1719685934", "environment": "production", "description": "A constructive and inclusive social network for software developers. With you every step of your journey.", "keywords": "software development, engineering, rails, javascript, ruby", "og:type": "website", "og:url": "https://dev.to/", "og:title": "DEV Community", "og:image": "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8lvvnvil0m75nw7yi6iz.jpg", "og:description": "A constructive and inclusive social network for software developers. With you every step of your journey.", "og:site_name": "DEV Community", "twitter:site": "@thepracticaldev", "twitter:title": "DEV Community", "twitter:description": "A constructive and inclusive social network for software developers. With you every step of your journey.", "twitter:image:src": "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8lvvnvil0m75nw7yi6iz.jpg", "twitter:card": "summary_large_image", "viewport": "width=device-width, initial-scale=1.0, viewport-fit=cover", "apple-mobile-web-app-title": "dev.to", "application-name": "dev.to", "theme-color": "#000000", "forem:name": "DEV Community", "forem:logo": "https://media.dev.to/cdn-cgi/image/width=512,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png", "forem:domain": "dev.to", "title": "DEV Community" }
ziemlich cool, nicht wahr?
Meta-Tags sind HTML-Elemente, die verwendet werden, um Suchmaschinen und anderen Clients zusätzliche Informationen über eine Seite bereitzustellen.
Diese Tags umfassen normalerweise ein Namens- oder Eigenschaftsattribut, das die Art der Informationen definiert, und ein Inhaltsattribut, das den Wert dieser Informationen enthält. Hier ist ein Beispiel für zwei Meta-Tags:
<meta name="description" content="The <meta> HTML element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>."> <meta property="og:image" content="https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png">
Das erste Tag enthält eine Beschreibung der Seite, während das zweite ein Open Graph-Tag ist, das ein Bild definiert, das angezeigt werden soll, wenn die Seite in sozialen Medien geteilt wird.
Eine praktische Anwendung von Meta-Tags ist die Erstellung eines Lesezeichen-Managers. Anstatt den Titel, die Beschreibung und das Bild für jedes Lesezeichen manuell hinzuzufügen, können Sie diese Informationen mithilfe von Meta-Tags automatisch aus der mit Lesezeichen versehenen URL entfernen.
Open Graph ist ein Internetprotokoll, das ursprünglich von Facebook entwickelt wurde, um die Verwendung von Metadaten innerhalb einer Webseite zur Darstellung des Inhalts einer Seite zu standardisieren. Es hilft sozialen Netzwerken, umfangreiche Linkvorschauen zu erstellen.
Lesen Sie hier mehr darüber.
Die API, die wir erstellen, wird aus zwei Teilen bestehen, einer Funktion zum Abrufen und Parsen der Meta-Tags und einem API-Server, der auf HTTP-Anfragen antwortet.
Beginnen wir damit, dass wir zu Deno Deploy gehen und uns anmelden.
Klicken Sie nach der Anmeldung auf „Neuer Spielplatz“
Damit geben wir uns einen Hallo-Welt-Ausgangspunkt.
Jetzt fügen wir eine Funktion namens getMetaTags hinzu, die eine URL akzeptiert und die Fetch-API verwendet, um den HTML-Code der angeforderten URL abzurufen und ihn an ein Paket zur HTML-Analyse (deno-dom) weiterzuleiten.
Um deno-dom zu unserem Projekt hinzuzufügen, können wir den jsr-Paketmanager verwenden:
curl https://metatags.deno.dev/api/meta?url=https://dev.to
Jetzt verwenden wir die Fetch-API, um den HTML-Code als Text abzurufen:
{ "last-updated": "2024-10-15 15:10:02 UTC", "user-signed-in": "false", "head-cached-at": "1719685934", "environment": "production", "description": "A constructive and inclusive social network for software developers. With you every step of your journey.", "keywords": "software development, engineering, rails, javascript, ruby", "og:type": "website", "og:url": "https://dev.to/", "og:title": "DEV Community", "og:image": "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8lvvnvil0m75nw7yi6iz.jpg", "og:description": "A constructive and inclusive social network for software developers. With you every step of your journey.", "og:site_name": "DEV Community", "twitter:site": "@thepracticaldev", "twitter:title": "DEV Community", "twitter:description": "A constructive and inclusive social network for software developers. With you every step of your journey.", "twitter:image:src": "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8lvvnvil0m75nw7yi6iz.jpg", "twitter:card": "summary_large_image", "viewport": "width=device-width, initial-scale=1.0, viewport-fit=cover", "apple-mobile-web-app-title": "dev.to", "application-name": "dev.to", "theme-color": "#000000", "forem:name": "DEV Community", "forem:logo": "https://media.dev.to/cdn-cgi/image/width=512,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png", "forem:domain": "dev.to", "title": "DEV Community" }
Nachdem wir den HTML-Code erhalten haben, können wir ihn mit deno-dom analysieren und dann Standard-DOM-Funktionen wie querySelectorAll verwenden, um alle Meta-HTML-Elemente abzurufen, sie zu iterieren und getAttribute zu verwenden, um den Namen, die Eigenschaft und den Inhalt jedes einzelnen abzurufen dieser Tags:
<meta name="description" content="The <meta> HTML element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>."> <meta property="og:image" content="https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png">
Abschließend fragen wir noch den
import { DOMParser, Element } from "jsr:@b-fuze/deno-dom";
Es ist nicht gerade ein Meta-Tag, aber ich denke, dass es ein nützliches Feld ist, also wird es trotzdem Teil unserer API sein. :)
Unsere endgültige getMetaTags-Funktion sollte so aussehen:
const headers = new Headers(); headers.set("accept", "text/html,application/xhtml+xml,application/xml"); const res = await fetch(url, { headers }); const html = await res.text();
Der Einfachheit halber habe ich mich entschieden, den integrierten http-Server von Deno zu verwenden, der nur ein einfacher Deno.serve()-Aufruf ist.
Dank der Tatsache, dass deno auf Webstandards basiert, können wir das integrierte Response-Objekt in der Fetch-API verwenden, um auf Anfragen zu antworten.
curl https://metatags.deno.dev/api/meta?url=https://dev.to
Unser Server analysiert die Anforderungs-URL, prüft, ob wir eine GET-Anfrage an den /api/meta-Pfad erhalten haben, ruft die von uns erstellte getMetaTags-Funktion auf und gibt dann die Meta-Tags als Antworttext zurück.
Wir fügen außerdem zwei Header hinzu. Der erste ist Content-Type, der benötigt wird, damit der Client weiß, welche Art von Daten er in der Antwort erhält, in unserem Fall eine JSON-Antwort.
Der zweite Header ist „Access-Control-Allow-Origin“, der es unserer API ermöglicht, Anfragen von bestimmten Ursprüngen zu akzeptieren. In unserem Fall habe ich „*“ gewählt, um jeden Ursprung zu akzeptieren, aber vielleicht möchten Sie es ändern, um nur Anfragen von zu akzeptieren Der Ursprung Ihres Frontends.
Beachten Sie, dass die CORS-Header nur vom Browser gestellte Anfragen betreffen. Das bedeutet, dass der Browser die Anfrage entsprechend dem im Header angegebenen Ursprung blockiert, ein direkter Aufruf der API von einem Server jedoch weiterhin möglich ist. Lesen Sie hier mehr über CORS.
Sie können jetzt auf „Speichern und bereitstellen“ klicken
Warten Sie dann, bis Deno Deploy Ihren Code auf dem Playground bereitstellt:
Die URL oben rechts ist die URL Ihres Spielplatzes. Kopieren Sie sie und fügen Sie /api/meta?url=https://dev.to hinzu, um sie in Aktion zu sehen. Die URL sollte etwa wie https://metatags.deno.dev aussehen /api/meta?url=https://dev.to
Sie sollten nun sehen, dass die API mit den Meta-Tags von dev.to antwortet!
Die Verwendung des Playgrounds von Deno Deploy bedeutet, dass Ihr Code technisch gesehen bereits bereitgestellt, öffentlich und für jedermann zugänglich ist.
Für eine einfache API wie die, die wir erstellen, kann ein Spielplatz mit einer einzigen Datei ausreichen, aber in vielen Fällen möchten wir unser Projekt gerne weiter skalieren, dafür können Sie den Github-Export von Deno Deploy verwenden, um ein geeignetes Code-Repository dafür zu erstellen Sie API, mit Unterstützung für die automatische Erstellung neuer Code-Pushs:
oder über die Einstellungen des Spielplatzes:
Die in diesem Beitrag vorgestellte Scraping-Methode funktioniert nur auf Websites, deren vom Server zurückgegebene HTML-Datei Meta-Tags enthält. Das bedeutet, dass vom Server gerenderte oder vorgerenderte Websites mit größerer Wahrscheinlichkeit korrekte Ergebnisse liefern. Single-Page-Apps können auch so lange funktionieren da die Meta-Tags zur Build-Zeit und nicht zur Laufzeit festgelegt werden.
Wir haben gezeigt, wie schnell und einfach es ist, eine API mit Deno zu erstellen und bereitzustellen, wir haben Meta-Tags besprochen und wie wir die Fetch-API, einen DOM-Parser und den integrierten Server von Deno verwenden können, um eine zu erstellen Meta-Tags-Scraping-API in weniger als 40 Codezeilen.
Um das in diesem Beitrag erstellte Projekt zu sehen, können Sie sich den Deno-Deploy-Playground ansehen (Sie müssen /api/meta?url=https://dev.to zur URL-Leiste auf der rechten Seite hinzufügen, um eine zu sehen Beispielantwort) oder dieses Github-Repository.
Ich hoffe, dieser Beitrag hat Sie dazu inspiriert, die Leistungsfähigkeit von Meta-Tags und Deno zu erkunden! Versuchen Sie, Ihre eigene Version der API zu erstellen oder sie wie einen Lesezeichen-Manager in ein Projekt zu integrieren.
Sie sind nicht weitergekommen, haben Fragen oder möchten zeigen, was Sie gebaut haben? Schreiben Sie unten einen Kommentar oder verbinden Sie sich mit mir auf Twitter/X – ich würde mich freuen, von Ihnen zu hören!
Schauen Sie sich hier meinen vorherigen Beitrag über den Aufbau einer React State Management-Bibliothek in weniger als 40 Codezeilen an.
Das obige ist der detaillierte Inhalt vonErstellen einer Meta-Tags-Scraping-API in Unterzeilen mit Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!