如何使用 node.js 和 javascript 模仿 Facebook 的“链接共享”功能

Posted

技术标签:

【中文标题】如何使用 node.js 和 javascript 模仿 Facebook 的“链接共享”功能【英文标题】:How to mimic Facebook's "link share" functionality using node.js and javascript 【发布时间】:2011-08-05 03:40:38 【问题描述】:

所以我想模仿的是 Facebook 提供的链接共享功能。您只需输入 URL,然后 FB 会自动从目标网站获取图像、标题和简短描述。如何使用 node.js 和其他可能需要的 javascript 库在 javascript 中对此进行编程?我找到了一个使用 php 的 fopen 函数的例子,但我不想在这个项目中包含 PHP。

我问的是网页抓取的例子吗?我需要做的就是从目标网站的元标记中检索数据,然后还使用 CSS 选择器获取图像标记吗?

如果有人能指出我正确的方向,那将不胜感激。谢谢!

【问题讨论】:

从这里开始:blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs 【参考方案1】:

是的,需要网络抓取,这很容易。困难的部分是查找标题和相关文本和图像的通用算法。

如何抓取

您可以使用 jsdom 在您的服务器中下载并创建一个 DOM 结构,然后在您的服务器上使用 jquery 抓取该结构。您可以按照上面@generalhenry 的建议在blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs 找到一个很好的教程。

刮什么

我想找到标题的好方法是:-

var h;
for(var i=6; i<=1; i++)
 if(h = $('h'+i).first())
  break;
 

现在h 将有标题或undefined 如果失败。替代方法可以简单地获取页面的title 标签。 :)

至于图片。列出该页面上所有或前几张相当大的图像,即过滤掉用于按钮、箭头等的精灵。

在获取远程数据时,请确保 ProcessExternalResources 标志已关闭。这将确保广告的脚本标签不会污染获取的页面。

是的,相关文本将在h 之后的某些标签中。

【讨论】:

感谢您的回复。那么为什么下面的代码不能获取元数据呢。 var meta=$('meta[name="description"]').attr("content");这不是读取 $() jquery 函数中的元元素吗?【参考方案2】:

查看THIS 的帖子。它讨论了使用 node.js 进行抓取。 HERE 你以前有很多关于使用 javascript 和 jquery 抓取的信息。

也就是说,Facebook 实际上并没有猜测标题、描述和预览是什么,他们(至少在大多数情况下)从希望更容易被 fb 用户访问的站点中的元标记中获取这些信息。

也许您可以利用现有的元数据来提取标题、描述和 img 预览。可用元数据的文档是HERE。

【讨论】:

是的,如果页面有 opengraph 元数据,这将有所帮助。在其他情况下,我们需要使用一些启发式方法。 是的,感谢两位的回答。我正在寻找更多关于如何处理它的详细计划,因为我已经阅读了所有列出的教程和指南——我确实做了我的研究。通过查看示例代码,我学得最好。有人可以将我链接到一些使用 javascript 完成类似操作的代码吗?你如何抓取页面上的 html 标签? 另外,我想知道屏幕抓取和网页抓取有什么区别。我想要做的事情需要 AJAX 吗?我读过很多帖子提到由于安全问题,AJAX 无法从其他域的网站检索数据。 @Ern 我之前实际上没有进行过抓取,抱歉,没有代码可以分享。关于AJAX,它不是必需的,相反,正如您所说,甚至不可能通过AJAX进行跨站点请求。所以你应该在服务器端进行所有的抓取。出于可用性目的,您始终可以在演示文稿中添加 AJAX 层(即向服务器端代码发出 AJAX 请求以执行抓取、检索结果并呈现它们),但实际抓取始终在服务器端完成。跨度>

以上是关于如何使用 node.js 和 javascript 模仿 Facebook 的“链接共享”功能的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 和 Node.js 将捕获的图像存储到 MySQL 数据库中

如何使用 node.js 在服务器端使用纯 JavaScript 读取 JSON 文件?

如何使用 Node.js/JavaScript 合并两个按键值匹配的数组值

如何系统地学习Node.js?

如何在 Node.js 和浏览器之间共享代码?

javascript 如何将MongoDB与Node.js一起使用