Whatsapp이나 Telegram과 같은 메시지 앱을 통해 내가 보내는 링크의 미리보기를 어떻게 볼 수 있는지 궁금한 적이 있나요?
이 게시물에서는 URL을 받아들이고 이에 대한 메타 태그를 검색하는 스크래핑 API를 Deno로 구축하여 거의 모든 웹사이트에서 제목, 설명, 이미지 등과 같은 필드를 얻을 수 있습니다.
예:
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에서 이 정보를 자동으로 스크랩할 수 있습니다.
오픈 그래프는 원래 웹페이지 내 메타데이터 사용을 표준화하여 페이지 콘텐츠를 표시하기 위해 Facebook에서 만든 인터넷 프로토콜로, 소셜 네트워크에서 풍부한 링크 미리 보기를 생성하는 데 도움이 됩니다.
자세한 내용은 여기를 참조하세요.
우리가 구축 중인 API는 메타 태그를 가져오고 구문 분석하는 기능과 HTTP 요청에 응답하는 API 서버라는 두 부분으로 구성됩니다.
Deno Deploy로 이동하여 로그인하는 것부터 시작하겠습니다.
로그인 후 "새 놀이터"를 클릭하세요
이것이 우리에게 Hello World 시작점을 제공할 것입니다.
이제 URL을 허용하고 Fetch API를 사용하여 요청된 URL의 HTML을 가져온 다음 이를 HTML 구문 분석용 패키지(deno-dom)에 전달하는 getMetaTags라는 함수를 추가하겠습니다.
프로젝트에 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을 사용하여 구문 분석한 다음 querySelectorAll과 같은 표준 DOM 함수를 사용하여 모든 메타 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">
마지막으로
import { DOMParser, Element } from "jsr:@b-fuze/deno-dom";
정확히는 메타 태그는 아니지만 유용한 필드라고 생각하므로 어쨌든 API의 일부가 될 것입니다. :)
최종 getMetaTags 함수는 다음과 같습니다.
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();
단순화를 위해 저는 단순한 Deno.serve() 호출인 Deno에 내장된 http 서버를 사용하기로 결정했습니다.
deno는 웹 표준을 기반으로 구축되었기 때문에 Fetch API에 내장된 Response 개체를 사용하여 요청에 응답할 수 있습니다.
curl https://metatags.deno.dev/api/meta?url=https://dev.to
우리 서버는 요청 URL을 구문 분석하고 /api/meta 경로에 대한 GET 요청을 받았는지 확인한 후 우리가 만든 getMetaTags 함수를 호출한 다음 메타 태그를 응답 본문으로 반환합니다.
또한 두 개의 헤더를 추가합니다. 첫 번째는 클라이언트가 응답에서 받는 데이터 종류를 아는 데 필요한 Content-Type이며, 우리의 경우 JSON 응답입니다.
두 번째 헤더는 API가 특정 출처의 요청을 수락할 수 있도록 하는 Access-Control-Allow-Origin입니다. 이 경우에는 모든 출처를 허용하기 위해 "*"를 선택했지만 다음의 요청만 수락하도록 변경하고 싶을 수도 있습니다. 프런트엔드의 출처입니다.
CORS 헤더는 브라우저의 요청에만 영향을 미칩니다. 즉, 브라우저는 헤더에 지정된 원본에 따라 요청을 차단하지만 서버에서 API를 직접 호출하는 것은 여전히 가능합니다. 여기에서 CORS에 대해 자세히 알아보세요.
이제 "저장 및 배포"를 클릭할 수 있습니다
그런 다음 deno 배포가 플레이그라운드에 코드를 배포할 때까지 기다립니다.
오른쪽 상단에 있는 URL은 플레이그라운드의 URL입니다. 이를 복사하고 /api/meta?url=https://dev.to를 추가하여 실제로 작동하는지 확인하세요. URL은 https://metatags.deno.dev와 유사해야 합니다. /api/meta?url=https://dev.to
이제 dev.to의 메타 태그로 응답하는 API를 볼 수 있습니다!
Deno 배포 플레이그라운드를 사용한다는 것은 귀하의 코드가 기술적으로 이미 배포되었으며 공개되어 누구나 액세스할 수 있음을 의미합니다.
우리가 구축하고 있는 것과 같은 간단한 API의 경우 단일 파일 플레이그라운드로 충분할 수 있지만 대부분의 경우 프로젝트를 더 확장하고 싶습니다. 이를 위해 Deno 배포의 Github 내보내기를 사용하여 적절한 코드 저장소를 만들 수 있습니다. 새로운 코드 푸시 시 자동 빌드를 지원하는 API:
또는 놀이터 설정에서:
이 게시물에 제시된 스크래핑 방법은 서버에서 반환된 html 파일에 메타 태그가 있는 웹사이트에서만 작동합니다. 즉, 서버에서 렌더링되거나 사전 렌더링된 사이트가 적절한 결과를 반환할 가능성이 더 높으며, 단일 페이지 앱도 가능한 한 작동할 수 있습니다. 메타 태그는 런타임이 아닌 빌드 시간에 설정되기 때문입니다.
우리는 Deno를 사용하여 API를 구축하고 배포하는 것이 얼마나 빠르고 간단한지 시연했으며, 메타 태그를 살펴보고, Fetch API, DOM 파서 및 Deno의 내장 서버를 사용하여 API를 구축하는 방법을 설명했습니다. 40줄 미만의 코드로 메타태그 스크래핑 API를 제공합니다.
이 게시물에 구축된 프로젝트를 보려면 Deno 배포 플레이그라운드를 확인하세요. (오른쪽 URL 표시줄에 /api/meta?url=https://dev.to를 추가해야 볼 수 있습니다.) 예시 응답) 또는 이 github 저장소.
이 게시물이 여러분이 메타 태그와 Deno의 힘을 탐구하는 데 영감을 주었기를 바랍니다! 자신만의 API 버전을 구축하거나 북마크 관리자와 같은 프로젝트에 통합해 보세요.
막히거나 질문이 있거나 자신이 만든 것을 자랑하고 싶으신가요? 아래에 댓글을 달거나 Twitter/X에서 저와 연결하세요. 여러분의 의견을 듣고 싶습니다!
여기에서 40줄 미만의 코드로 반응 상태 관리 라이브러리를 구축하는 방법에 대한 이전 게시물을 확인하세요.
위 내용은 코드 줄 아래에 메타태그 스크래핑 API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!