Vous êtes-vous déjà demandé comment les applications de messagerie comme Whatsapp ou Telegram vous permettent de voir un aperçu d'un lien que vous envoyez ?
Dans cet article, nous allons créer une API de scraping avec Deno qui accepte une URL et récupère les balises méta correspondantes, afin que nous puissions obtenir des champs tels que le titre, la description, l'image et plus encore à partir de presque n'importe quel site Web.
Par exemple :
curl https://metatags.deno.dev/api/meta?url=https://dev.to
donnera ce résultat
{ "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" }
plutôt cool, n'est-ce pas ?
Les balises méta sont des éléments HTML utilisés pour fournir des informations supplémentaires sur une page aux moteurs de recherche et à d'autres clients.
Ces balises incluent généralement un attribut de nom ou de propriété qui définit le type d'informations et un attribut de contenu qui contient la valeur de ces informations. Voici un exemple de deux balises méta :
<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">
La première balise fournit une description de la page, tandis que la seconde est une balise Open Graph qui définit une image à afficher lorsque la page est partagée sur les réseaux sociaux.
Une application pratique des balises méta consiste à créer un gestionnaire de favoris. Au lieu d'ajouter manuellement le titre, la description et l'image de chaque signet, vous pouvez automatiquement extraire ces informations de l'URL du signet à l'aide de balises méta.
Open Graph est un protocole Internet créé à l'origine par Facebook pour standardiser l'utilisation de métadonnées dans une page Web pour représenter le contenu d'une page. Il aide les réseaux sociaux à générer des aperçus de liens riches.
En savoir plus ici.
L'API que nous construisons comprendra deux parties, une fonction de récupération et d'analyse des balises méta, et un serveur API qui répondra aux requêtes HTTP.
Commençons par accéder à Deno Deploy et nous connecter.
Après vous être connecté, cliquez sur "Nouveau terrain de jeu"
Cela nous donnera un point de départ pour bonjour le monde.
Nous allons maintenant ajouter une fonction appelée getMetaTags qui accepte une URL et utilise l'API Fetch pour obtenir le code HTML de l'URL demandée et le transmet à un package pour l'analyse HTML (deno-dom).
Pour ajouter deno-dom à notre projet, nous pouvons utiliser le gestionnaire de packages jsr :
curl https://metatags.deno.dev/api/meta?url=https://dev.to
Nous allons maintenant utiliser l'API Fetch pour obtenir le code HTML sous forme de texte :
{ "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" }
Après avoir obtenu le code HTML, nous pouvons utiliser deno-dom pour l'analyser, puis utiliser les fonctions DOM standard comme querySelectorAll pour obtenir tous les éléments méta HTML, les parcourir et utiliser getAttribute pour obtenir le nom, la propriété et le contenu de chacun. de ces balises :
<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">
Enfin, nous interrogerons également le
import { DOMParser, Element } from "jsr:@b-fuze/deno-dom";
Ce n'est pas exactement une balise méta, mais je pense que c'est un champ utile, donc il fera de toute façon partie de notre API. :)
Notre fonction finale getMetaTags devrait ressembler à ceci :
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();
Pour plus de simplicité, j'ai décidé d'utiliser le serveur http intégré de Deno qui n'est qu'un simple appel Deno.serve().
Grâce au fait que deno est construit sur les standards du Web, nous pouvons utiliser l'objet Response intégré dans l'API Fetch pour répondre aux requêtes.
curl https://metatags.deno.dev/api/meta?url=https://dev.to
Notre serveur analyse l'URL de la requête, vérifie si nous avons reçu une requête GET sur le chemin /api/meta et appelle la fonction getMetaTags que nous avons créée, puis renvoie les balises méta comme corps de réponse.
Nous ajoutons également deux en-têtes, le premier est Content-Type qui est nécessaire pour que le client connaisse le type de données qu'il obtient dans la réponse, qui dans notre cas est une réponse JSON.
Le deuxième en-tête est Access-Control-Allow-Origin qui permet à notre API d'accepter les requêtes provenant d'origines spécifiques. Dans notre cas, j'ai choisi "*" pour accepter n'importe quelle origine, mais vous souhaiterez peut-être le modifier pour n'accepter que les requêtes de l'origine de votre frontend.
Notez que les en-têtes CORS n'affecteront que les requêtes effectuées par le navigateur, ce qui signifie que le navigateur bloquera la requête en fonction de l'origine spécifiée dans l'en-tête, mais qu'il sera toujours possible d'appeler directement l'API depuis un serveur. En savoir plus sur CORS ici.
Vous pouvez maintenant cliquer sur "Enregistrer et déployer"
Attendez ensuite que deno déployer déploie votre code sur le terrain de jeu :
L'URL en haut à droite est l'URL de votre terrain de jeu, copiez-la et ajoutez /api/meta?url=https://dev.to pour la voir en action, l'URL devrait ressembler à https://metatags.deno.dev /api/meta?url=https://dev.to
Vous devriez maintenant voir l'API répondre avec les balises méta de dev.to !
L'utilisation du terrain de jeu de Deno déployer signifie que votre code est techniquement déjà déployé, qu'il est public et accessible à tous.
Pour une API simple comme celle que nous construisons, un seul fichier de jeu peut suffire, mais dans de nombreux cas, nous aimerions étendre davantage notre projet, pour cela, vous pouvez utiliser l'exportation Github de Deno déployer pour créer un référentiel de code approprié pour votre API, avec prise en charge de la construction automatique sur de nouveaux push de code :
ou depuis les paramètres de l'aire de jeux :
La méthode de scraping présentée dans cet article ne fonctionne que sur les sites Web qui ont des balises méta dans le fichier HTML renvoyé par le serveur, ce qui signifie que les sites rendus par le serveur ou pré-rendus sont plus susceptibles de renvoyer des résultats corrects, les applications d'une seule page peuvent également fonctionner aussi longtemps car les balises méta sont définies au moment de la construction et non au moment de l'exécution.
Nous avons démontré à quel point il est simple et rapide de créer et de déployer une API avec Deno, nous avons passé en revue les balises Meta et comment nous pouvons utiliser l'API Fetch, un analyseur DOM et le serveur intégré de Deno pour créer un Les balises méta récupèrent l'API en moins de 40 lignes de code.
Pour voir le projet construit dans cet article, vous pouvez consulter le terrain de jeu de déploiement Deno (vous devrez ajouter /api/meta?url=https://dev.to à la barre d'URL à droite pour voir un exemple de réponse) ou ce dépôt github.
J'espère que cet article vous a inspiré à explorer la puissance des balises méta et de Deno ! Essayez de créer votre propre version de l'API ou intégrez-la dans un projet comme un gestionnaire de favoris.
Vous êtes bloqué, vous avez des questions ou vous souhaitez montrer ce que vous avez construit ? Déposez un commentaire ci-dessous ou connectez-vous avec moi sur Twitter/X – j'aimerais avoir de vos nouvelles !
Consultez mon article précédent sur la création d'une bibliothèque de gestion d'état de réaction en moins de 40 lignes de code ici.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!