搜索
首页web前端js教程在代码行下构建元标签抓取 API

您是否想知道 Whatsapp 或 Telegram 等消息传递应用程序如何让您查看发送的链接的预览?

Building a Meta Tags Scraping API in Under Lines of Code

Building a Meta Tags Scraping API in Under Lines of Code


Whatsapp 和 Telegram 网址预览

在这篇文章中,我们将使用 Deno 构建一个抓取 API,它接受 URL 并检索它的元标记,这样我们就可以从几乎任何网站获取标题、描述、图像等字段。

例如:

curl https://metatags.deno.dev/api/meta?url=https://dev.to

将给出这个结果

{
  "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"
}

很酷,不是吗?

元标签以及为什么我们需要它们

元标记是 HTML 元素,用于向搜索引擎和其他客户端提供有关页面的附加信息。
这些标签通常包括定义信息类型的名称或属性属性,以及包含该信息的值的内容属性。这是两个元标记的示例:

<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">

第一个标签提供页面的描述,而第二个标签是开放图谱标签,定义在社交媒体上共享页面时要显示的图像。

元标签的一个实际应用是构建书签管理器。您无需为每个书签手动添加标题、描述和图像,而是可以使用元标记自动从添加书签的 URL 中抓取此信息。

打开图

Open Graph 是一种互联网协议,最初由 Facebook 创建,旨在标准化网页内元数据的使用来表示页面内容,它可以帮助社交网络生成丰富的链接预览。
在这里阅读更多相关信息。

为什么是德诺?

  1. Deno 具有安全默认设置,这意味着它需要明确的文件、网络和环境访问权限,从而降低安全漏洞的风险。
  2. Deno 基于 Web 标准构建,使用 ES 模块,旨在使用 Web 平台 API(例如 fetch)而不是专有 API,使 Deno 代码与您在浏览器中编写的代码非常相似 - 但仍然有一些规范与浏览器的偏差。
  3. Deno 具有内置的 TypeScript 支持,允许您无需构建步骤即可编写 TypeScript 代码。
  4. Deno 附带一个标准库,其中包括用于 HTTP 服务器、文件系统操作等常见任务的模块。
  5. Deno 提供了 Linter、Formatter 和 Test runner,允许您使用该平台而不是依赖第三方软件包或工具,使其成为 Javascript 开发的一体化工具。
  6. Deno 提供 Deno Deploy,这是一个可扩展的平台,适用于全球分布的无服务器 JavaScript/Typescript 应用程序,确保最小的延迟和最长的正常运行时间。

我们正在构建的 API 将由两部分组成,一个用于获取和解析元标记的函数,以及一个响应 HTTP 请求的 API 服务器。

获取元标签

让我们首先转到 Deno Deploy 并登录。
登录后点击“New Playground”
Building a Meta Tags Scraping API in Under Lines of Code
这将为我们提供一个 hello world 起点。
现在我们将添加名为 getMetaTags 的函数,该函数接受 url 并使用 Fetch API 获取所请求 URL 的 HTML 并将其传递到用于 HTML 解析的包 (deno-dom)。
要将 deno-dom 添加到我们的项目中,我们可以使用 jsr 包管理器:

curl https://metatags.deno.dev/api/meta?url=https://dev.to

现在我们将使用 Fetch API 来获取 HTML 文本:

{
  "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"
}

获取 HTML 后,我们可以使用 deno-dom 对其进行解析,然后使用标准 DOM 函数(如 querySelectorAll)获取所有元 HTML 元素,迭代它们并使用 getAttribute 获取每个元素的名称、属性和内容这些标签:

<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">

最后,我们还将查询

;页面元素,将其添加为 API 中的字段:<br> <pre class="brush:php;toolbar:false">import { DOMParser, Element } from "jsr:@b-fuze/deno-dom"; </pre> <p>它不完全是一个元标记,但我认为它是一个有用的字段,所以无论如何它将成为我们 API 的一部分。 :)</p> <p>我们最终的 getMetaTags 函数应如下所示:<br> </p> <pre class="brush:php;toolbar:false"> 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(); </pre> <h2> 服务器 </h2> <p>为了简单起见,我决定使用 Deno 内置的 http 服务器,这只是一个简单的 Deno.serve() 调用。<br> 由于 deno 是基于 Web 标准构建的,因此我们可以使用 Fetch API 中内置的 Response 对象来响应请求。<br> </p> <pre class="brush:php;toolbar:false">curl https://metatags.deno.dev/api/meta?url=https://dev.to </pre> <p>我们的服务器解析请求 URL,检查是否收到对 /api/meta 路径的 GET 请求,并调用我们创建的 getMetaTags 函数,然后返回元标记作为响应正文。</p> <p>我们还添加了两个标头,第一个是 Content-Type,客户端需要它来了解他们在响应中获取的数据类型,在我们的示例中是 JSON 响应。</p> <p>第二个标头是 Access-Control-Allow-Origin,它允许我们的 API 接受来自特定来源的请求,在我们的例子中,我选择“*”接受任何来源,但您可能希望将其更改为仅接受来自以下来源的请求你前端的起源。<br> 请注意,CORS 标头只会影响浏览器发出的请求,这意味着浏览器将根据标头中指定的来源阻止请求,但仍然可以从服务器直接调用 API。在这里阅读有关 CORS 的更多信息。</p> <p>您现在可以点击“保存并部署”<br> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172949959089268.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Building a Meta Tags Scraping API in Under Lines of Code"><br> 然后等待 deno deploy 将代码部署到 Playground:<br> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172949959198494.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Building a Meta Tags Scraping API in Under Lines of Code"><br> 右上角的 url 是你的 Playground 的 url,复制它并添加 /api/meta?url=https://dev. 来查看它的实际情况,该 url 应该类似于 https://metatags.deno.dev /api/meta?url=https://dev.to<br> 您现在应该看到 API 使用 dev.to 的元标记进行响应!<br> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172949959294656.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Building a Meta Tags Scraping API in Under Lines of Code"></p> <h2> 部署 </h2> <p>使用 Deno 部署的 Playground 意味着您的代码在技术上已经部署,它是公开的并且任何人都可以访问。<br> 对于像我们正在构建的这样的简单 API,单个文件游乐场就足够了,但在许多情况下,我们希望进一步扩展我们的项目,为此,您可以使用 Deno 部署的 Github 导出来为以下项目创建适当的代码存储库:您的 API,支持自动构建新代码推送:<br> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172949959428755.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Building a Meta Tags Scraping API in Under Lines of Code"><br> 或从游乐场的设置:<br> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172949959544011.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Building a Meta Tags Scraping API in Under Lines of Code"></p> <h2> 注意事项 </h2> <p>本文中介绍的抓取方法仅适用于从服务器返回的 html 文件中具有元标记的网站,这意味着服务器渲染或预渲染的网站更有可能返回正确的结果,单页应用程序也可以工作因为元标记是在构建时设置的,而不是在运行时设置的。</p> <h2> 结论 </h2> <p>我们演示了使用 Deno 构建和部署 API 是多么快速和简单,我们已经了解了 Meta 标签,以及如何使用 Fetch API、DOM 解析器和 Deno 内置服务器来构建元标记在 40 行代码内抓取 API。</p> <p>要查看本文中构建的项目,您可以查看 Deno 部署游乐场(您需要将 /api/meta?url=https://dev.to 添加到右侧的网址栏才能看到响应示例)或此 github 存储库。</p> <hr> <h2> 您接下来要构建什么? </h2> <p>我希望这篇文章能够启发您探索元标签和 Deno 的力量!尝试构建您自己的 API 版本或将其集成到书签管理器等项目中。 </p> <p>遇到困难、有疑问或想展示您构建的内容?请在下面发表评论或在 Twitter/X 上与我联系 – 我很乐意收到您的来信! </p> <p>查看我之前关于用不到 40 行代码构建 React 状态管理库的文章。</p>

以上是在代码行下构建元标签抓取 API的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
JavaScript在行动中:现实世界中的示例和项目JavaScript在行动中:现实世界中的示例和项目Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

了解JavaScript引擎:实施详细信息了解JavaScript引擎:实施详细信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:学习曲线和易用性Python vs. JavaScript:学习曲线和易用性Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python vs. JavaScript:社区,图书馆和资源Python vs. JavaScript:社区,图书馆和资源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C到JavaScript:所有工作方式从C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript引擎:比较实施JavaScript引擎:比较实施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

超越浏览器:现实世界中的JavaScript超越浏览器:现实世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器