创建一个无要的函数来刮掉网页元数据

2021-06-07 01:26:30

如今,大多数网站在HTML标记中直接提供关于它们内容的元数据。此帖子将向您展示如何使用MetaScraper来创建Vercel无操作功能以刮除此数据。

MetaScraper是一个基于规则的系统,允许根据一系列规则搜索网站内容。它被分发为开源节点.js库。

您可以在任何Node.js应用程序中使用MetaScraper。在我看来,最便捷的使用方法是给定输入URL的一个小节点.js服务器,将返回有关目标网页的结构化元数据作为输出。这个想法是创建一个API:

检查有效的URL已作为参数(例如:AS?URL Query-参数)。

鉴于此Node.js Server的目标非常好,我们不希望请求需要很长时间运行,这是一个很好的适合将其部署为无操作系统/ lambda函数。我将使用Vercel部署无服务器函数,但是您可以在支持Node.js(例如,AWS Lambda,Firebase,NetWase等)上的任何其他无服务器API提供程序上对此操作。通过创建项目目录,CD进入IT,使用NPM初始化:

并将您的start脚本更新为" start&#34 ;:" Vercel dev"在本地运行无务函数。

// api / scrape.js //在Vercel中,文件夹中的任何文件" / api"映射到" / api / *"和//将被视为API端点。 //对于API工作路由,您需要将函数导出为默认值(A.k.a请求处理程序),然后接收以下参数:// - req:请求对象。 // - res:响应对象。 //请参阅https://vercel.com/docs/serverless-functions/supported-languages#node.js了解详细信息。导出默认async函数处理程序(req,res){res。状态(200)。发送(`你好世界!`)}

您现在应该能够运行将代码部署到Vercel(当然,我们还没有在API / Scrape.js中添加任何“真实”逻辑,因此它现在不会做任何事情)。在这些场合我的进一步方法是创建一个GitHub回购并将其连接到Vercel,以便在每个提交上自动部署项目 - 但如果您愿意,您也可以手动执行。

首先,我们将使用Get NPM包来获取网站内容(随意使用任何其他获取库),以及MetasCraper NPM包以提取元数据:

MetaScraper使用“规则捆绑”提取元数据。规则包是确定属性周围的HTML选择器的集合。 MetaScraper NPM包不会包含开箱即用的任何规则包,因此您需要安装手动需要的每个规则束。您可以检查MetasCraper文档的“规则捆绑”部分以查看可用捆绑包的列表。要确保我们可以提取尽可能多的元数据,让我们添加(几乎)所有这些:

NPM i MetaScraper-Amazon MetaScaper-Audio Metascaper-Authent MetaScraper-Clearbit Metascaper-Diame Metascaper-Design Metascaper-Image Metascraper-Instagram Metascraper-Lang MetaScraper-Logo Metascaper-Logo Metascraper-Pureascaper-Logo Metascraper-Soundcloud Metascaper-SoundCloud Metascaper-SoundCloud Metascraper-SoundCloud Metascaper-SoundCloud MetaScraper-Soundcare Metascraper标题Metascraper-URL MetaScraper-Video Metascraper-YouTube

我们现在可以在API / Scrape.js中设置我们的API逻辑。为简单起见,这是整个代码(有评论):

// api / scrape.js //在Vercel中,文件夹中的任何文件" / api"映射到" / api / *"和//将被视为API端点。 const {parse} =要求(" url"); const get =要求(" got"); //初始化在要使用的规则捆绑列表中传递的Metascraper。 Const Metascraper =要求(" MetaScraper")([" Metascraper-Amazon")(),要求(" Metascraper-audio")(),要求( " metascraper-author")(),要求(" metascraper-date")(),需要(" metascraper-description")(),要求(&# 34; Metascraper-Image")(),要求(" Metascraper-Instagram")(),要求(" metascraper-lang")(),需要(" metascraper-logo")(),要求(" metascraper-clembit-logo")(),要求(" metascraper-logo-favicon")(),要求(&# 34; Metascraper-Publisher")(),需要(" MetaScraper-可读性")(),要求(" metascraper-spotify")(),要求(" metascraper-title")(),要求(" metascraper-telegram")(),要求(" metascraper-url")(),需要(" metascraper- Logo-Favicon")(),要求(" Metascraper-Amazon")(),r equire(" metascraper-youtube" )(),要求(" metascraper-soundcloud")(),需要(" metascraper-video")(),]); //对于API工作路由,您需要将函数导出为默认值(A.k.a请求处理程序),然后接收以下参数:// - req:请求对象。 // - res:响应对象。 //请参阅https://vercel.com/docs/serverless-functions/supported-languages#node.js了解详细信息。导出默认async函数处理程序(req,res){//解析"?url"查询参数。 const targeturl = parse(req .url,true).query?.url; //确保提供的URL有效。 if(!targeturl){res。状态(401)。发送('请在" url&#34中提供有效的URL;查询参数。');返回 ;尝试{//使用get库获取网站内容。 const {body:html,url} =等待GOT(targeturl); //从网站内容中提取元数据。 const元数据=等待Metascraper({HTML,URL}); // Vercel Edge网络可以缓存边缘处的响应,以便//尽可能快地为用户提供数据。 //在这里我们'重新加强边缘处的响应1小时。 //请参阅https://vercel.com/docs/edge-network/caching for详情。 res。 Setheader("缓存控制"," s-maxage = 3600"); //将元数据返回JSON RES。状态(200)。 JSON(元数据);捕获(错误){控制台。日志(错误); res。状态(401)。 JSON({错误:`无法刮伤" $ {url}"`}); }}

就是这样。通过在URL查询参数中使用有效的URL调用/ api / scrape端点来运行npm start(或部署代码),您应该使用网页元数据获取JSON响应。

{" lang" :" en" ,"作者" :null,"标题" :"谷歌" ,"出版商" :null,"图像" :" https://www.google.com/images/branding/googleg/1x/googleg_standard_color_128dp.png" ,"音频" :null,"日期" :null,"描述" :"搜索世界的信息,包括网页,图像,视频等。谷歌有许多特殊功能可以帮助您找到您正在寻找的内容。" ,#34;视频" :null," logo" :" https://logo.clearbit.com/www.google.com" ," url" :" https://www.google.com/" }

您可以在Github上找到此项目的整个源代码 - 请随时叉子叉或试试!

MetaScraper-Video Package取决于IS-Video Package,以确定标记是否包含有效的视频URL,并且IS-Video取决于保存有效视频扩展列表的视频扩展程序包。遗憾的是,视频扩展程序包现在尚未更新,因此它不支持M3U8视频扩展(现在是网络上的流行视频分机)。在释放此拉索请求并更新为视频才能使用最新版本的视频扩展,您可以使用以下差异使用Patch-Package手动修补M3U8支持(通过将其放入修补程序/视频) -extensions + 1.1.0.patch)。

diff --git a / node_modules /视频扩展/视频扩展.json b / node_modules /视频扩展/视频扩展.jsonindex 0ad84d7..a115959 100644 --- a / node_modules / video-extensions /视频扩展。 json +++ b / node_modules /视频扩展/视频 - extensions.json @@ -8,6 +8,7 @@" DRC&#34 ;," flv&#34 ;,&#34 ; M2V&#34 ;, +" m3u8&#34 ;," m4p&#34 ;," mkv&#34 ;," mkv&#34 ;,